Sorry for a very basic questions about rtree.
I would like to check whether the point is inside the polygon and the distance (point to the nearest point in polygon) as well. I was thinking about using No-SQL database, but both MongoDb and GeoCouch support Polygon records, but don't provide searches like: - what polygons are around the point (for example, I want to find near what polygons a user is currently located; and after that check what in the precise distance from the user to the nearest polygon point)
So, I want to figure out how to make these kind of spatial searches using python and related libraries only (shapely, geopy, rtree). Here are the steps I am following:
- I have shapefile with the targeted polygons (saved from QGis)
- I want to make Rtree Index, to improve performance when working with Shapely and geopy
I am wondering, whether I can:
- make Rtree Index for shapefile directly?
If not. I can use shapefile lib to collect polygon coordinates or bounding boxes:
>>> shapes.points [[120.9937913, 24.7902669], [120.9939797, 24.790369], [120.994035, 24.7902849], [120.9938467, 24.7901828], [120.9937913, 24.7902669]] >>> shapes.bbox [120.9937913, 24.7901828, 120.994035, 24.790369]
Now I am a bit confused, and trying to understand how to create rtree index file for my polygons:
>>> idx = index.Index() //creating index >>> left, bottom, right, top = (24.7901828, 24.790369, 120.9937913, 120.994035) // can I put bbox coordinates here? I assume that coordinates are in the form [xmin, xmax, ymin, ymax] >>> idx.insert(0, (left, bottom, right, top))
Would it be a right way for me to make Rtree Index?:
import shapefile from rtree import index sf = shapefile.Reader("polygons.shp") idx = index.Index() shapes = sf.shapes() id_num = 0 for shape in shapes: sh = shape.bbox xmin = sh ymin = sh xmax = sh ymax = sh idx.insert(id_num, (xmin,ymin,xmax,ymax)) id_num = id_num + 1
After I execute the script above, I can get the following result from idx.bounds:
>>> idx.bounds [24.7796055, 120.9839184, 24.7986571, 121.0025152]
To what bounds these coordinates are related to? Is it the bbox for the all the polygons?
Is this a right way to check whether there are polygons near the Point? Assuming that the point coordinates are 24.789077, 120.999792
>>> list(idx.nearest((24.789077, 24.789077, 120.999792, 120.999792))) [1, 2, 13, 29, 61, 62, 59, 60, 27, 28, 55, 5, 26, 54, 78, 49, 50, 3, 9, 10, 22, 72, 43, 39, 42, 85, 40, 8, 17, 76, 77, 36, 73, 71, 33, 34, 69, 63, 66, 64]
I am getting these results and not quite sure what they mean.. What does "nearest" exactly mean here? I cannot measure the distance here, like 5 meters.. so what is the "nearest" output here and how it's calculated?