Python 3.x GeoPandas-地理数据不重叠形状文件地图
我正在尝试将一些从geopandas.GeoDataFrame转换为shapely.geometry.Point对象的lat/long数据映射到从下载的英国shapefile。提取时有3个.shp文件,每个文件都出现以下问题 以下是我的代码:Python 3.x GeoPandas-地理数据不重叠形状文件地图,python-3.x,pandas,gis,shapefile,geopandas,Python 3.x,Pandas,Gis,Shapefile,Geopandas,我正在尝试将一些从geopandas.GeoDataFrame转换为shapely.geometry.Point对象的lat/long数据映射到从下载的英国shapefile。提取时有3个.shp文件,每个文件都出现以下问题 以下是我的代码: import geopandas as gpd geometry = [Point(xy) for xy in zip(df['longitude'], df['latitude'])] crs = {'init': 'epsg:4326'} geo_d
import geopandas as gpd
geometry = [Point(xy) for xy in zip(df['longitude'], df['latitude'])]
crs = {'init': 'epsg:4326'}
geo_df = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)
ukmap = gpd.read_file("..\\gb_1km.shp")
fig, ax = plt.subplots(figsize=(6,6))
ukmap.plot(ax=ax) #check map
geo_df.plot(ax=ax, markersize=20, color='blue', marker = 'o', label = 'C')
输出如下所示:
如果没有背景形状文件,几何图形的绘图如下所示:
为什么会发生这种情况?我如何修复它?谢谢
编辑:epsg=27700
回答得更详细一点,因为这似乎足够清楚 在代码生成
geo_df
中,您指定了'epsg:4326'
的crs
,并基于您的代码,在度纬度和经度上工作。这可以通过查看来确认,其中指定CRS的边界为[-180,-90,180,90]
我下载并阅读了您链接的文件。此代码:
uk_10km = gpd.read_file(r'/Users/brendancox/Downloads/Great_Britain_shapefile/gb_10km.shp')
uk_10km.crs
返回
{'init': 'epsg:3035'}
表示其单位为米。WGS84的界限是[-10.6700,34.5000,31.5500,71.0500],但是的预测界限是[2426378.0132,1528101.2618,6293974.6215,5446513.5222]
因此,当您将geo_df
绘制到UK shapefile上时,它将与ukmap
crs
对齐,并将其放置在下角
鉴于EPSG 4326适用于整个全球,而您的关注点是英国,我建议使用英国特有的预测。EPSG 3035似乎适用于整个欧洲,因此您可能会找到一个英国特定的投影,使用geopandas.GeoDataFrame.to_crs()
将两个形状文件转换为该投影
可复制示例
这显示了如何将内置的
世界
形状重新投影到EPSG 3035以增加比例,并使城市
形状出现在(0,0)附近的一个小簇中——在这种情况下,位于地图的中心。回答得更详细一些,因为这看起来足够清楚了
在代码生成geo_df
中,您指定了'epsg:4326'
的crs
,并基于您的代码,在度纬度和经度上工作。这可以通过查看来确认,其中指定CRS的边界为[-180,-90,180,90]
我下载并阅读了您链接的文件。此代码:
uk_10km = gpd.read_file(r'/Users/brendancox/Downloads/Great_Britain_shapefile/gb_10km.shp')
uk_10km.crs
返回
{'init': 'epsg:3035'}
表示其单位为米。WGS84的界限是[-10.6700,34.5000,31.5500,71.0500],但是的预测界限是[2426378.0132,1528101.2618,6293974.6215,5446513.5222]
因此,当您将geo_df
绘制到UK shapefile上时,它将与ukmap
crs
对齐,并将其放置在下角
鉴于EPSG 4326适用于整个全球,而您的关注点是英国,我建议使用英国特有的预测。EPSG 3035似乎适用于整个欧洲,因此您可能会找到一个英国特定的投影,使用geopandas.GeoDataFrame.to_crs()
将两个形状文件转换为该投影
可复制示例
这显示了如何将内置的
world
形状重新投影到EPSG 3035以增加比例,并使cities
形状出现在(0,0)附近的一个小簇中——在这种情况下,位于地图的中心。您是否检查了geo_df
和ukmap
的crs
是否相同?根据您的绘图,它们可能不是。您是否检查了geo_df
和ukmap
的crs
是否相同?根据您的绘图,它们可能不是。EPSG:27700是您回复和评论的首选GB ProjectionBank。对于UK,使用epsg=27700,一些进展如OP中的第3张图表所示-UK形状文件现在居中,但点对象仍然压缩为一个点。我怀疑这是因为坐标尚未对齐。第二个图形,OP,轴运行b/w-8和0(X),50到58(Y),而第三个图形,OP,轴运行b/w-250000和750000(X),-250000到150000(Y)。有什么想法可以同步它们吗?@shanloh看起来是同一个问题:由于坐标系不同,点对象都聚集在(0,0)周围,而整个英国形状是根据较大的值绘制的。是否已将两个形状文件转换为相同的CRS?如果您还没有,请通读geopandas页面。是的,我做了以下操作并检查了crs:geo_df=gpd.GeoDataFrame(df,crs={'init':'epsg:27700'},geometry=geometry)geo_df.crs#打印{'init':'epsg 27700'}
,但输出与OP中的图3保持不变。我还注意到类型(点)中的值geo_df中的列不会更改,我认为我们希望这些列在英国shapefile轴值的范围内?很高兴您能正常工作。Re:speed:在代码运行时,您可能希望尝试使用不太详细的形状文件,然后在其他所有内容都排序后切换到更详细的形状文件。例如,链接中的10km形状文件约为200 kb,而1km形状文件约为19 MB——我认为使用10km文件可以显著加快代码速度,但这也可能取决于geo_df
dataframe中的信息量。EPSG:27700是回复和评论时首选的GB ProjectionTank。对于UK,使用epsg=27700,一些进展如OP中的第3张图表所示-UK形状文件现在居中,但点对象仍然压缩为一个点。我怀疑这是因为坐标尚未对齐。第二个图形,OP,轴运行b/w-8和0(X),50到58(Y),而第三个图形,OP,轴运行b/w-250000和750000(X),-250000到150000(Y)。有什么想法可以同步它们吗?@shanloh看起来是同一个问题:由于坐标系不同,点对象都聚集在(0,0)周围,而整个英国形状是根据较大的值绘制的。你有信心吗