我有两个点文件数据集 – Census Block CentroIDs和餐馆.我希望找到每个人口普查区块中心距离它最近的餐厅的距离.对于同一个餐厅而言,对于多个街区来说,最近的餐厅没有任何限制.
这对我来说有点复杂的原因是因为Geopandas Distance function根据索引计算元素,匹配.因此,我的一般方法是将Restaurants文件转换为多点文件,然后将blocks文件的索引设置为全部相同的值.然后,所有块质心和餐馆都具有相同的索引值.
import pandas as pdimport geopandas as gpdfrom shapely.geometry import polygon,Point,MultiPoint
现在阅读Block CentroID和Restaurant Shapefiles:
Blocks=gpd.read_file(BlockShp)Restaurants=gpd.read_file(RestaurantShp)
由于Geopandas距离函数按元素计算距离,我将Restaurant GeoSerIEs转换为MultiPoint GeoSerIEs:
RestMulti=gpd.GeoSerIEs(Restaurants.unary_union)RestMulti.crs=Restaurants.crsRestMulti.reset_index(drop=True)
然后我将Blocks的索引设置为等于0(与Restaurants多点相同的值)作为元素计算的解决方法.
Blocks.index=[0]*len(Blocks)
最后,我使用Geopandas距离函数计算每个Block质心到最近餐馆的距离.
Blocks['distance']=Blocks.distance(RestMulti)
请提供有关如何改进这方面的任何建议.我并不喜欢使用Geopandas或Shapely,但我希望学习Arcpy的替代方案.
谢谢您的帮助!
解决方法 如果我正确理解您的问题,块和餐馆的尺寸可能会有很大差异.出于这个原因,尝试通过重建索引强制转换为表格格式可能是一种糟糕的方法.我会绕过街区并获得到餐馆的最小距离(就像@shonGololo建议的那样).
我会稍微更通用一些(因为我已经记下了这段代码)并且在点与线之间做了一段距离,但是相同的代码应该从点到点或从多边形到多边形.我将从点开始使用GeoDataFrame,然后我将创建一个与行距离最小的新列.
%matplotlib inlineimport matplotlib.pyplot as pltimport shapely.geometry as geomimport numpy as npimport pandas as pdimport geopandas as gpdlines = gpd.GeoSerIEs( [geom.linestring(((1.4,3),(0,0))),geom.linestring(((1.1,2.),(0.1,0.4))),geom.linestring(((-0.1,3.),(1,2.)))])# 10 pointsn = 10points = gpd.GeoSerIEs([geom.Point(x,y) for x,y in np.random.uniform(0,3,(n,2))])# Put the points in a dataframe,with some other random columndf_points = gpd.GeoDataFrame(np.array([points,np.random.randn(n)]).T)df_points.columns = ['Geometry','Property1']points.plot()lines.plot()
现在获取点到线的距离,并且只保存每个点的最小距离(请参阅下面的适用版本)
min_dist = np.empty(n)for i,point in enumerate(points): min_dist[i] = np.min([point.distance(line) for line in lines])df_points['min_dist_to_lines'] = min_distdf_points.head(3)
这使
Geometry Property1 min_dist_to_lines0 POINT (0.2479424516236574 2.944916965334865) 2.621823 0.1932931 POINT (1.465768457667432 2.605673714922998) 0.6074484 0.2263532 POINT (2.831645235202689 1.125073838462032) 0.657191 1.940127
—-编辑—-
(取自github问题)使用apply更好,更符合你在熊猫中的表现:
def min_distance(point,lines): return lines.distance(point).min()df_points['min_dist_to_lines'] = df_points.geometry.apply(min_distance,df_lines)总结
以上是内存溢出为你收集整理的python – 使用Geopandas计算与最近特征的距离全部内容,希望文章能够帮你解决python – 使用Geopandas计算与最近特征的距离所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)