我正在尝试合并两个地理数据帧(想要查看每个点所在的多边形)。
以下代码首先向我发出警告(" CRS does not match!
")
然后是一个错误(" RTreeError: Coordinates must not have minimums more than maximums
")。
那里究竟出了什么问题? CRS是否协调系统?如果是这样,为什么他们没有以相同的方式加载?
import geopandas as gpd
from shapely.geometry import Point, mapping,shape
from geopandas import GeoDataFrame, read_file
#from geopandas.tools import overlay
from geopandas.tools import sjoin
print('Reading points...')
points=pd.read_csv(points_csv)
points['geometry'] = points.apply(lambda z: Point(z.Latitude, z.Longitude), axis=1)
PointsGeodataframe = gpd.GeoDataFrame(points)
print PointsGeodataframe.head()
print('Reading polygons...')
PolygonsGeodataframe = gpd.GeoDataFrame.from_file(china_shapefile+".shp")
print PolygonsGeodataframe.head()
print('Merging GeoDataframes...')
merged=sjoin(PointsGeodataframe, PolygonsGeodataframe, how='left', op='intersects')
#merged = PointsGeodataframe.merge(PolygonsGeodataframe, left_on='iso_alpha2', right_on='ISO2', how='left')
print(merged.head(5))
链接到复制数据: Shapefile, GPS points
答案 0 :(得分:1)
由于我最近一直在努力解决这个问题,因此在这里找不到很好的答案,因此我将在此处添加答案。 Geopandas documentation很好地说明了如何解决“ CRS不匹配”问题。
我从下面的文档中复制了整个代码块,但最相关的一行是这一行,其中的to_crs()
方法用于重新投影地理数据框。您可以调用mygeodataframe.crs
查找每个数据帧的CRS,然后调用to_crs()
重新投影一个以匹配另一个数据框,如下所示:
world = world.to_crs({'init': 'epsg:3395'})
仅设置PointsGeodataframe.crs = PolygonsGeodataframe.crs
可以阻止引发错误,但是不能正确地重新投影几何图形。
完整的文档代码供参考:
# load example data
In [1]: world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
# Check original projection
# (it's Platte Carre! x-y are long and lat)
In [2]: world.crs
Out[2]: {'init': 'epsg:4326'}
# Visualize
In [3]: ax = world.plot()
In [4]: ax.set_title("WGS84 (lat/lon)");
# Reproject to Mercator (after dropping Antartica)
In [5]: world = world[(world.name != "Antarctica") & (world.name != "Fr. S. Antarctic Lands")]
In [6]: world = world.to_crs({'init': 'epsg:3395'}) # world.to_crs(epsg=3395) would also work
In [7]: ax = world.plot()
In [8]: ax.set_title("Mercator");
答案 1 :(得分:0)
正如对该问题的评论中所述,您可以通过手动设置(pd.concat([
SampleDf,
SampleDf.ReportField.str.extract(r"\((.*?)(\d+)\)", expand=True)
], axis=1).sort_values(1)
.groupby(0).ReportField.agg({'ratio': "/".join}).reset_index(drop=True))
# ratio
#0 sum(field1)/count(field2)/Max(field3)
#1 Sum(value1)
来消除CRS does not match!
警告(假设两个数据集的CRS确实相同)。
但是,这并不能解决PointsGeodataframe.crs = PolygonsGeodataframe.crs
问题。您可能在RTreeError
中缺少lat / lon数据 - 在这种情况下,您最终会创建包含NaN值的points_csv
个对象(即Point
),这些对象会继续导致Point(nan nan)
中出现问题。我遇到了类似的问题,修复只是为了在CSV中加载时过滤掉缺少坐标数据的行:
rtree