现在我有一个GeoJson文件和以下函数使用匀称:
它接受一个坐标并返回邻域名称
def get_neighb(lat, lon):
"""Input Latitude and Longitude, Returns Neighborhood Name"""
point = Point(lon, lat)
found = False
for feature in geo_data['features']:
polygon = shape(feature['geometry'])
if polygon.contains(point):
return(feature['properties']['neighborhood'])
found = True
if found is False:
return('NA')
# Initialize list
tn = ['']*data.shape[0]
for i in range(len(tn)):
tn[i] = get_neighb(data.latitude[i], data.longitude[i])
这很有效,但它真的很慢,对我如何加速它的任何想法,目前在4,000,000行上运行。
答案 0 :(得分:2)
你必须找到一个不检查每一行的策略。最简单的方法是将所有形状转储到地理感知数据库中并进行查询。像后期gis或弹性搜索这样的东西。
另一种策略可能是找到所有邻域的质心,然后使用KD树仅过滤附近质心的邻域。
答案 1 :(得分:1)
如果你想避免使用PostGIS数据库的重型机器,可能会感兴趣的是使用rtree
包作为(如文档所述)" cheapo空间数据库&#34 ;。这个想法主要如下:
#!/usr/bin/env python
from itertools import product
from random import uniform, sample, seed
from rtree import index
from shapely.geometry import Point, Polygon, box, shape
from shapely.affinity import translate
seed(666)
#generate random polygons, in your case, the polygons are stored
#in geo_data['features']
P = Polygon([(0, 0), (0.5, 0), (0.5, 0.5), (0, 0.5), (0, 0)])
polygons = []
for dx, dy in product(range(0, 100), range(0, 100)):
polygons.append(translate(P, dx, dy))
#construct the spatial index and insert bounding boxes of all polygons
idx = index.Index()
for pid, P in enumerate(polygons):
idx.insert(pid, P.bounds)
delta = 0.5
for i in range(0, 1000):
#generate random points
x, y = uniform(0, 10), uniform(0, 10)
pnt = Point(x, y)
#create a region around the point of interest
bounds = (x-delta, y-delta, x+delta, y+delta)
#also possible, but much slower
#bounds = pnt.buffer(delta).bounds
#the index tells us which polygons are worth checking, i.e.,
#the bounding box of which intersects with the region constructed in previous step
for candidate in idx.intersection(bounds):
P = polygons[candidate]
#test only these candidates
if P.contains(pnt):
print(pnt, P)