経度と緯度の行を使用して、Pandas Data Frameからシェープファイルを構築したいと思います。
私はcsvファイルを持っているので、パンダで処理して、処理しやすいデータフレームを作成します
行ごとにループを作成せずにそれを行うことは可能ですか?
経度と緯度の行を使用して、Pandas Data Frameからシェープファイルを構築したいと思います。
私はcsvファイルを持っているので、パンダで処理して、処理しやすいデータフレームを作成します
行ごとにループを作成せずにそれを行うことは可能ですか?
回答:
少し遅れますが、他の人にも役立つかもしれません。はい、それはshapely
and でできます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でエラーを検索してください。ほとんどの場合、その問題を解決する回答が用意されているからです。
次に、データフレーム内にlat値とlon値をshapely Point()
オブジェクトに結合する新しいジオメトリ列を作成するだけです。Point()
コンストラクタはfloat値のタプルを想定しているため、データフレームの列のdtypeがに設定されていない場合、変換を含める必要があることに注意してください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()
メソッドを使用します(Fionaがサポートする他のドライバーGeoJSON
も動作するはずです)。
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
そして、QGISで視覚化すると、結果のシェープファイルは次のようになります。
ArcMapの場合、Shapefileにエクスポートする前にProjectionを定義する必要があります。
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で開くと、座標系は不明です。私は何を間違えていますか?