[GIS] Fast way to get all points as integer of a LineString in shapely

coordinatesimagelinepythonshapely

So I have a shapely LineString:

print np.round(shapely_intersecting_lines.coords).astype(np.int) 
>>> array([[ 1520, -1140],
           [ 1412,  -973]])

I want to get all the points in between, that is I want to get the points of the line in between as integer values so I can use them in an image. Anyone know how I can do this with shapely? Or do I have to use another library. I need this to be as efficient as possible as I will be doing this many times.

Best Answer

I'm assuming you want each pixel point along each line. You can do this by interpolating each point along a distance of 1.0 units along the line. This might need to be refined, but try:

import numpy as np
from shapely.geometry import LineString

ls = LineString([(1520, -1140), (1412,  -973)])

xy = []
for f in range(0, int(ceil(ls.length)) + 1):
    p = ls.interpolate(f).coords[0]
    pr = map(round, p)
    if pr not in xy:
        xy.append(pr)

ar = np.array(xy, 'i')

Gives you:

array([[ 1520, -1140],
       [ 1519, -1139],
       [ 1519, -1138],
       ..., 
       [ 1413,  -975],
       [ 1412,  -974],
       [ 1412,  -973]], dtype=int32)

You may also be interested in rasterize() from rasterio to burn the shape of geometries into a raster image. It's a bit more complicated, as you would need to define an affine transform for the bounds of the geometry.