基本操作です。
※見やすさのため不要なインデントをつけています。
空間演算は 以下を参照。
spatial overlays
https://github.com/geopandas/geopandas/blob/master/examples/overlays.ipynb
Spatial Joins
https://github.com/geopandas/geopandas/blob/master/examples/spatial_joins.ipynb
import geopandas as gpd
#Ver. 0.6.3
#読み込み
#SHP、GeoJSON、GeoPackage に対応
gdf = gpd.read_file('./A.shp')
#フォルダ内のSHPファイルを全て読み込み結合
import glob
import pandas as pd
shpfiles = [
shpfile for shpfile in glob.glob('./shp/*.shp')]
gdf = pd.concat(
[gpd.read_file(shpfile)for shpfile in shpfiles])
#df(csv)からgdfを作成
#https://gis.stackovernet.com/ja/q/47396
import pandas as pd
from shapely.geometry import Point
geometry = [Point(xy) for xy in zip(df.lon, df.lat)]
crs = {'init': 'epsg:6668'}
gdf = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)
#書き込みSHP、GeoJSON、GeoPackage
#shpは仕様上、属性255種までの制限あり。型の制限もあり。
#geojsonはQGISで読みこみ可。Arcはtoolboxから変換。
#geojsonはdaytime型不可。→事前にstr型変換
gdf.to_file('./A.shp')
gdf.to_file('./A.geojson', driver='GeoJSON')
#型変換(pandasと同操作)
gdf['時刻']=gdf['時刻'].astype(str)
#A列(属性)削除 (pandasと同操作)
gdf.drop('A',axis=1)
#列名(属性名)変更 (pandasと同操作)
gdf.columns = ['A','B','geometry']
#'都道府県'列(属性)から3県を含む行抽出 (pandasと同操作)
gdf3=gdf[(gdf['都道府県']=='茨城')|
(gdf['都道府県']=='埼玉')|
(gdf['都道府県']=='群馬')|]
#型変換(pandasと同操作)
gdf['時刻']=gdf['時刻'].astype(str)
#属性の追加、演算(pandasと同操作)
gdf['C']=gdf['A']-gdf['B']
#県単位でディゾルブ(地物をまとめる)
gdf=gdf3.dissolve(by='都道府県')
#属性結合
#gdfにA列をkeyとしてDataFrameを属性結合
#df.merge だと df になる
gdf=gdf.merge(df, on='A')
#Coordinate Reference Systems
#CRS確認
gdf.crs
#gdf1のCRSをgdf2のCRSに変更(一致)
#EPSG:4612 : JGD2000
#EPSG:6668 : JGD2011
gdf1 = gdf1.to_crs(gdf2.crs)
#地図プロット
#matplotlibベース
#1レイヤー
gdf.plot(figsize=(10, 10),
alpha=0.5,
edgecolor='k')
#3レイヤー:gdfを重ねて表示
#Choropleth Map(ポリゴン1枚目)
base=gdf1.plot(figsize=(10, 10),
column='A',
cmap='OrRd',
alpha=0.8,
legend=True,
legend_kwds={'label':'aaa',
orientation:'horizontal'})
#ポリゴンを重ねる(2枚目)
ax=gdf2.plot(ax=base,
facecolor='none',
edgecolor='gray',
alpha=0.8)
#ポイントを重ねる(3枚目)
ax=gdf3.plot(ax=base,
marker='o',
color='red',
markersize=5)
#仕上げ
ax.set_xlabel('longitude')
ax.set_ylabel('latitude')
ax.grid()
ax.set_axisbelow(True) #grid moves back
#保存する場合は import matplotlib.pyplot as plt からの
plt.savefig("./aaa.png")
20200220 Foliumでの図化は移動しました。https://phreeqc.blogspot.com/2020/02/folium.html
番外編: rasterstats を用いたラスターからの統計量取得。
大量処理は速度面で不可。
#空間演算
from rasterstats import zonal_stats
zonal_stats(gdf, './aaa.tif', stats=['max'])
#フォルダ内のgeotiffを全て読み込み、統計量をgdfに結合
import glob
import os
path = './input/*.tif'
files= glob.glob(path)
for i, name in enumerate(files) :
print(i)
file_name = os.path.splitext(
os.path.basename(files[i]))[0]
print(file_name)
stats=pd.DataFrame(zonal_stats(gdf,
files[i],
stats=['max', 'count']))
gdf_max[file_name]=stats['max']
gdf_count[file_name]=stats['count']
0 件のコメント:
コメントを投稿