日々適当

hibitekitou

GeoPandas のお勉強(ゴミコードのみ)

cg |2024-05-11
import geopandas as gpd
import pandas as pd
import random
import svgwrite
import re
import datetime

print( datetime.datetime.now())
#基盤地図情報のgeoJSONデータを読み込み
gdf = gpd.read_file('./N03-20230101_12_GML/N03-23_12_230101.geojson', encoding='SHIFT-JIS')

#列の名前を変更
gdf_renamed = gdf.rename(columns={"N03_001":"Prefectures", \
								"N03_002":"BranchGov", \
								"N03_003":"County", \
								"N03_004":"City", \
								"N03_007":"AreaCode"})
#東京都以外の"City"列の名前に「区」が含まれる行の"City"列の値を"Country"と同じにする
gdf_renamed.loc[ (gdf_renamed["Prefectures"]!="東京都") & (gdf_renamed['City'].str.contains("区")) , 'City'] = gdf_renamed["County"]

#同じ市町村名を持つ行は一つの行にまとめる
gdf_grouped = gdf_renamed.dissolve(by=['Prefectures','City'], as_index=False)

#各市町村に適当すぎる色をつける
hexColors = []
for i in range(len(gdf_grouped)):
	hexColor = '#' + format(random.randrange(255), '02x') + \
	                 format(random.randrange(255), '02x') + \
	                 format(random.randrange(255), '02x')
	hexColors.append(hexColor)

cityNames = []
for i , row in gdf_grouped.iterrows():
	cityNames.append( row["City"] )

pdf_colors = pd.DataFrame({ 'City':cityNames, 'Color':hexColors})

pdf_mrgedColor = pd.merge(gdf_grouped, pdf_colors ,on='City' )
gdf_withColor = gpd.GeoDataFrame(pdf_mrgedColor)

#図法をWebメルカトルに
gdf_WebMerc = gdf_withColor.to_crs("EPSG:3857")
#ポイント削減
gds_WebMercSimple = gdf_WebMerc["geometry"].simplify(tolerance=10.)

#svgファイルへの書き出し
docSize = 2000
viewBoxSize = "0 0 %d %d"%(docSize, docSize)
bbox = gdf_WebMerc.total_bounds
xLength = bbox[2] - bbox[0]
yLength = bbox[3] - bbox[1]
if xLength > yLength:
	scale = docSize / xLength
else:
	scale = docSize / yLength

gds_WebMercSimple = gds_WebMercSimple.translate( -bbox[0] - xLength*0.5 ,  -bbox[1] - yLength*0.5)
gds_WebMercSimple = gds_WebMercSimple.scale(scale, -scale, origin=(docSize * 0.5 ,docSize * 0.5))
gdf_WebMercDeleted = gdf_WebMerc.drop('geometry', axis=1)
gdf_WebMercDeleted['geometry'] = gds_WebMercSimple

dwg = svgwrite.Drawing( "chibaMapWebMelc.svg", size=( docSize , docSize ), profile='tiny')
grp1 = dwg.add(dwg.g(id='市町村'))
for i , row in gdf_WebMercDeleted.iterrows():
	city_svg = row.geometry.svg()
	startIndies = [m.span() for m in re.finditer('M', city_svg)]
	endIndies = [m.span() for m in re.finditer('z', city_svg)]
	svgpath = ""
	for j in range(len(startIndies)):
		svgpath += city_svg[startIndies[j][0]:endIndies[j][1]]
	path = dwg.path( svgpath , stroke='none', stroke_width=3.0, fill=row['Color'], id=row['Prefectures'] + row['City'])
	grp1.add( path )

dwg.save()
print( datetime.datetime.now())
コメント ( 0 )|Trackback ( )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。