Nearest neighbor

Using a buffer, you can get all the incidents within a specified radius of the point of interest. But what if you only want the 5, 10, or 15 closest incidents? To do that, you can use the <-> operator or k-nearest neighbor.

You can use the following code to select the 15 closest points to a specified point, p:

p = Point([-106.578677,35.062485])
cursor.execute("SELECT ST_AsGeoJSON(incidents.geom), ST_Distance(incidents.geom::geography,ST_GeometryFromText('{}')::geography) from incidents ORDER BY incidents.geom<->ST_GeometryFromText('{}') LIMIT 15".format(p.wkt,p.wkt))
c=cursor.fetchall()
for x in c:
layer=json.loads(x[0])
layergeojson=GeoJSON(data=layer)
map.add_layer(layergeojson)

The previous code creates a point using Shapely, and uses it in the SQL query. The query selects the incident geometry as GeoJSON, and then calculates the distance of each incident from the specified point. The ORDER BY clause, <-> operator, and limit clause make sure that we get the 15 nearest points in order of closeness.

The last block of code is our code for adding the results to the map. The results are shown in the following screenshot. The point in the center of the screenshot is the specified point:

Now that you know how to map the results of your spatial queries, let's add interactive widgets to modify the queries and change the map without writing new code.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset