That's texture bleeding. There's no nice/easy fix for it, but it can be minimized with some adjustments.
So the issue is that the neighboring part of the texture you've "selected" with a texture rect/texture coordinates is bleeding into your selection. This happens because the coordinate falls on a none integer position, thus OpenGL has to decide which part of the texture it should now display, which can lead to OpenGL using the part of the neighboring texture to fill the gap.
One thing you can do to minimize the visual effect is to have a 1px wide border around each of your tile, that way if it bleeds, it doesn't bleed the next tile.
Then you need to make sure your vertex array is positioned at integer positions and not in between "pixels".
Other than that you need to make sure that you zoom at round multiples, so the entity positions remain integers.
An alternative that shouldn't cause bleeding is to render to a render texture and use that texture for zooming and translating.