我正在尝试将一些经纬度数据转换成来自geopandas.GeoDataFrame的shapely.geometry.Point对象到从here下载的UK 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')
输出看起来像这样:
没有背景shapefile,几何图形如下:
为什么会这样,我该如何解决?谢谢
编辑:使用epsg = 27700
答案 0 :(得分:2)
更详细地回答,因为这似乎很清楚...
在生成geo_df
的代码中,您指定crs
的{{1}},并根据您的代码在纬度和经度上进行工作。通过查看EPSG 4326可以确认这一点,该{C3的边界指定为[-180,-90,180,90]。
我下载并阅读了链接的文件。这段代码:
'epsg:4326'
返回
uk_10km = gpd.read_file(r'/Users/brendancox/Downloads/Great_Britain_shapefile/gb_10km.shp')
uk_10km.crs
EPSG 3035表示其单位为米。 WGS84边界为[-10.6700、34.5000、31.5500、71.0500],但投影边界为[2426378.0132、1528101.2618、6293974.6215、5446513.5222]。
因此,当您将{'init': 'epsg:3035'}
绘制到UK shapefile上时,它将与geo_df
ukmap
对齐,并将其放在底角。
鉴于EPSG 4326适用于全球,并且您正在关注英国,所以我建议使用特定于英国的投影。 EPSG 3035似乎适用于整个欧洲,因此您可能会找到一个英国特定的投影,可以使用crs
将两个形状文件转换为该投影。
geopandas.GeoDataFrame.to_crs()
这显示了如何将内置world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))
world.to_crs(epsg='3035', inplace=True)
fig, ax = plt.subplots(figsize=(10,8))
world.plot(ax=ax)
cities.plot(ax=ax, color='red')
plt.show()
形状重新投影到EPSG 3035,如何扩大比例,并使world
形状出现在(0,0)附近的小簇中。情况,在地图的中心。