Pandasデータフレームからシェープファイルを作成しますか?


12

経度と緯度の行を使用して、Pandas Data Frameからシェープファイルを構築したいと思います。

私はcsvファイルを持っているので、パンダで処理して、処理しやすいデータフレームを作成します

行ごとにループを作成せずにそれを行うことは可能ですか?


csvの場合、ArcMapで[XYデータの追加]を使用してレイヤーを作成し、シェープファイルとしてエクスポートできますか(レイヤーを右クリックしてデータを選択し、データをエクスポートします)。
mkennedy

ありがとう。でも、Pythonスクリプトを作成して、それをやりたいです。GISは不要
かもめ


ああ、わかった。コメントを削除するかもしれません!
mkennedy

回答:


16

少し遅れますが、他の人にも役立つかもしれません。はい、それはshapelyand でできます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で視覚化すると、結果のシェープファイルは次のようになります。

結果のシェープファイル


2
こんにちは、私は同様の状況を持っていますが、ポイントの代わりにポリゴンがあります。同様のことを行うことは可能ですdf ['geometry'] = df.apply(lambda x:Point((float(x.lon)、float(x.lat)))、axis = 1)が、ポリゴンで
ヴァレリオD.チオッティ

4

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で開くと、座標系は不明です。私は何を間違えていますか?
FaCoffee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.