ゾーンの適合性の範囲は1〜7です。一般に、3以上の値のゾーンが適しています。これらの地域を国勢調査データと組み合わせて、適切な風速を持ち、1平方キロメートルあたりの人口の0.5%未満の場所を選択します。
国勢調査データには、国勢調査単位ごとの人口データが含まれていますが、人口密度データは含まれていません。
1.人口統計属性フィールドを取得するには:
# 添加一个浮点字段,计算人口密度
# 通过HD01_S001字段获取人口普查数据
census_fn = os.path.join(data_dir, 'California', 'ca_census_albers.shp')
census_ds = ogr.Open(census_fn, True)
census_lyr = census_ds.GetLayer()
density_field = ogr.FieldDefn('popsqkm', ogr.OFTReal)
census_lyr.CreateField(density_field)
for row in census_lyr:
pop = row.GetField('HD01_S001')
sqkm = row.geometry().GetArea() / 1000000
row.SetField('popsqkm', pop / sqkm)
census_lyr.SetFeature(row)
# 获取因皮里尔县区域几何图像
county_fn = os.path.join(data_dir, 'US', 'countyp010.shp')
county_ds = ogr.Open(county_fn)
county_lyr = county_ds.GetLayer()
county_lyr.SetAttributeFilter("COUNTY ='Imperial County'")
county_row = county_lyr.GetNextFeature()
county_geom = county_row.geometry().Clone()
del county_ds
2.郡のデータは緯度と経度の座標を使用し、国勢調査地域と風力エネルギーのデータはメートルを使用するため、座標系を変換する必要があります。
# 转换坐标系
county_geom.TransformTo(census_lyr.GetSpatialRef())
census_lyr.SetSpatialFilter(county_geom)
# 设置属性过滤器
# 人口密度低于0.5%
census_lyr.SetAttributeFilter('popsqkm < 0.5')
3.風データセットに対して属性フィルタリングを実行し、レベルが3以上の領域のみを表示します。
wind_fn = os.path.join(data_dir, 'California', 'california_50m_wind_albers.shp')
wind_ds = ogr.Open(wind_fn)
wind_lyr = wind_ds.GetLayer()
wind_lyr.SetAttributeFilter('WPC >= 3')
4.新しいshpファイルを作成し、風力発電定格フィールドと人口密度フィールドを次の場所に追加します。
out_fn = os.path.join(data_dir, 'California', 'wind_farm.shp')
out_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(out_fn)
out_lyr = out_ds.CreateLayer('wind_farm', wind_lyr.GetSpatialRef(), ogr.wkbPolygon)
out_lyr.CreateField(ogr.FieldDefn('wind', ogr.OFTInteger))
out_lyr.CreateField(ogr.FieldDefn('popsqkm', ogr.OFTReal))
out_row = ogr.Feature(out_lyr.GetLayerDefn())
作成結果:
5.国勢調査データを風データと交差させ、新しく作成されたshpファイルに保存します。
#将人口普查数据与县界相交
for census_row in census_lyr:
census_geom = census_row.geometry()
census_geom = census_geom.Intersection(county_geom)
wind_lyr.SetSpatialFilter(census_geom)
print('Intersecting census tract with {0} wind polygons'.format(
wind_lyr.GetFeatureCount()))
# 检查是否存在风力多边形
if wind_lyr.GetFeatureCount() > 0:
out_row.SetField('popsqkm', census_row.GetField('popsqkm'))
for wind_row in wind_lyr:
wind_geom = wind_row.geometry()
# 检查人口普查数据是否与风力多边形相交
if census_geom.Intersect(wind_geom):
new_geom = census_geom.Intersection(wind_geom)
out_row.SetField('wind', wind_row.GetField('WPC'))
out_row.SetGeometry(new_geom)
out_lyr.CreateFeature(out_row)
del out_ds
演算結果:
既存の問題:点線の領域(黄色)は郡の境界データを表し、実線の領域(青)は国勢調査の境界を表します。2つは完全には重複していません。したがって、点線内のデータを使用して、風力発電所の場所を選択できます。
分析によって得られた風力発電所の建設に適した場所(色が濃いほど、風が強くなります):
既存の問題:画像を拡大すると、大きなポリゴンが多数あることがわかります。大きなポリゴンを小さなポリゴンにマージすると、効果が向上します。最も速い方法は、UnionCascaded()メソッドを使用することです。
6.小さなポリゴンを大きなポリゴンに結合します。
import os
from osgeo import ogr
from ospybook.vectorplotter import VectorPlotter
folder = r'E:\Google chrome\Download\gis with python\osgeopy data\California'
ds = ogr.Open(folder, True)
in_lyr = ds.GetLayerByName('wind_farm')
out_lyr = ds.CreateLayer(
'wind_farm2', in_lyr.GetSpatialRef(), ogr.wkbPolygon)
out_row = ogr.Feature(out_lyr.GetLayerDefn())
# 创建一个复合多边形来容纳要合并的小多边形
multipoly = ogr.Geometry(ogr.wkbMultiPolygon)
# 循环遍历原始输出中的行并获得几何图形
for in_row in in_lyr:
in_geom = in_row.geometry().Clone()
in_geom_type = in_geom.GetGeometryType()
# 如果几何图形是一个多边形,继续并将其添加到复合多边形
if in_geom_type == ogr.wkbPolygon:
multipoly.AddGeometry(in_geom)
# 打散复合多边形
elif in_geom_type == ogr.wkbMultiPolygon:
for i in range(in_geom.GetGeometryCount()):
multipoly.AddGeometry(
in_geom.GetGeometryRef(i))
# 将所有要素合并
multipoly = multipoly.UnionCascaded()
# 只保留大的多边形
for i in range(multipoly.GetGeometryCount()):
poly = multipoly.GetGeometryRef(i)
if poly.GetArea() > 1000000:
out_row.SetGeometry(poly)
out_lyr.CreateFeature(out_row)
del ds
面積が1平方キロメートル以上の面積が保持され、大きなポリゴンのみが保持されるため、処理が容易になります。
比較結果: