lon & lat 행을 사용하여 Pandas Data Frame에서 shapefile을 만들고 싶습니다.
CSV 파일을 가지고 있으며 처리하기 쉬운 데이터 프레임을 만들기 위해 팬더로 처리합니다.
루프를 한 줄씩 만들지 않고도 그렇게 할 수 있습니까?
lon & lat 행을 사용하여 Pandas Data Frame에서 shapefile을 만들고 싶습니다.
CSV 파일을 가지고 있으며 처리하기 쉬운 데이터 프레임을 만들기 위해 팬더로 처리합니다.
루프를 한 줄씩 만들지 않고도 그렇게 할 수 있습니까?
답변:
조금 늦었지만 다른 사람들에게도 유용합니다. 예, shapely
및 로 수행 할 수 있습니다 geopandas
.
팬더 데이터 프레임 종류가 다음과 같다고 가정합니다.
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에서 오류를 검색하십시오. 대부분 그 문제를 해결할 수있는 답변이있을 것입니다.
그런 다음 데이터 프레임에 위도 및 경도 값을 shapely Point()
객체 로 결합하는 새 지오메트리 열을 만드는 것 입니다. 참고는 것을 Point()
dataframe의 열 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를 덤프하기 위해 사용 geopandas ' to_file()
방법 (다른 드라이버가 지원 피오나 와 같은 GeoJSON
작업도해야한다) :
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
그리고 이것이 QGIS로 시각화 할 때 결과 모양 파일이 나타납니다 .
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"
British National Grid에 따라 모양 파일을 투영 하는 데 사용하여 비슷한 작업을 수행 했습니다. 그러나 ArcGIS에서 열면 좌표계를 알 수 없습니다. 내가 뭘 잘못하고 있죠?