Python地理データ処理9:発電所の場所

  ゾーンの適合性の範囲は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平方キロメートル以上の面積が保持され、大きなポリゴンのみが保持されるため、処理が容易になります。

比較結果:
ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/amyniez/article/details/113686410