Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x GeoPandas-地理数据不重叠形状文件地图_Python 3.x_Pandas_Gis_Shapefile_Geopandas - Fatal编程技术网

Python 3.x GeoPandas-地理数据不重叠形状文件地图

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

我正在尝试将一些从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_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)周围,而整个英国形状是根据较大的值绘制的。你有信心吗