3

我正在尝试合并两个地理数据框(想查看每个点所在的多边形)。

以下代码首先给我一个警告(“ 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 点

4

2 回答 2

1

我将在这里添加一个答案,因为我最近一直在努力解决这个问题并且在这里找不到一个很好的答案。Geopandas文档有一个很好的例子来说明如何解决“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");
于 2019-11-22T21:53:03.013 回答
1

如问题评论中所述,您可以CRS does not match!通过手动设置消除警告PointsGeodataframe.crs = PolygonsGeodataframe.crs(假设两个数据集的 CRS 确实相同)。

但是,这并没有解决RTreeError. 您可能会丢失 lat/lon 数据points_csv- 在这种情况下,您最终会创建Point包含 NaN 值(即Point(nan nan))的对象,这会继续导致rtree. 我有一个类似的问题,修复只是在加载 CSV 时过滤掉缺少坐标数据的行:

points=pd.read_csv(points_csv).dropna(subset=["Latitude", "Longitude"])
于 2017-07-15T20:36:06.260 回答