Answers:
有点晚了,但也许对其他人也有用。是的,可以使用shapely
和来完成geopandas
。
假设您的pandas数据框如下所示:
import pandas as pd
data = [
{'some_attribute': 'abc', 'lat': '50.1234', 'lon': '10.4023'},
{'some_attribute': 'def', 'lat': '40.5678', 'lon': '8.3365'},
{'some_attribute': 'ghi', 'lat': '60.9012', 'lon': '6.2541'},
{'some_attribute': 'jkl', 'lat': '45.3456', 'lon': '12.5478'},
{'some_attribute': 'mno', 'lat': '35.7890', 'lon': '14.3957'},
]
df = pd.DataFrame(data)
print(df)
=>
lat lon some_attribute
0 50.1234 10.4023 abc
1 40.5678 8.3365 def
2 60.9012 6.2541 ghi
3 45.3456 12.5478 jkl
4 35.7890 14.3957 mno
首先,确保geopandas
和shapely
安装是否正确,有时是不容易的,因为他们与一些依赖(如GEOS和GDAL)。如果一开始不起作用,请尝试通过pip install geopandas shapely
,在Google或StackOverflow / Gis.Stackexchange上搜索错误,因为很可能将有一个答案为您解决该问题。
然后,只需在数据框中创建一个新的几何列,即可将lat和lon值组合到一个shapely Point()
对象中。请注意,Point()
构造函数需要浮点值的元组,因此,如果数据帧的专栏dtypes尚未设定转换必须纳入float
。
from shapely.geometry import Point
# combine lat and lon column to a shapely Point() object
df['geometry'] = df.apply(lambda x: Point((float(x.lon), float(x.lat))), axis=1)
现在,将pandas DataFrame转换为GeoDataFrame
。geopandas构造函数期望一个由几何形状对象组成的几何列,因此我们创建的列就可以了:
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
倾倒这个GeoDataFrame成shape文件,使用geopandas' to_file()
方法(其它驱动器所支持菲奥娜如GeoJSON
也应工作):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
这就是用QGIS可视化时得到的shapefile的样子:
对于ArcMap,需要在导出到Shapefile之前定义投影。
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
# proj WGS84
df.crs= "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
df.crs= "+init=epsg:27700"
用来根据英国国家网格来投影我的shapefile。但是,当我在ArcGIS中打开它时,坐标系是未知的。我究竟做错了什么?