在地理区域中合并地理数据帧(CRS不匹配)

时间:2015-12-22 16:28:01

标签: pandas gis geopandas

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

以下代码首先向我发出警告(" 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))

链接到复制数据: ShapefileGPS points

2 个答案:

答案 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