別のポリゴン内の1つのシェープファイル内のポリゴンの割合


13

私は初心者です。これが明らかである/すでに質問され回答されているが、何も見つからなかった場合はおologiesび申し上げます。

私には2つのシェープファイルがあります。1。500個の小さなゾーンがあるLSOA境界として知られる英国の郡の管理境界層2.洪水ゾーン。

理想的には、どのLSOAゾーンのどれがフラッドゾーン内で50%以上であり、500 LSOAゾーンごとにyes / noまたは1/0になるかを調べたいと思います。

しかし、私はこれを行う方法がわかりません。2つのシェープファイルを結合できると考えましたが、それらの間に共通の属性はありません。次に、場所ごとに属性を結合機能を使用できると考えました。これは機能し、どのLSOAがフラッドゾーンにあるかを示しますが、それはほとんどすべてです(画像2を参照)。

これはSQLの問題だと思いますが、わかりません。私はQGISを初めて使用し、PostgreSQLを使用したことがありません。

どんな助けも大歓迎です。素敵な人々が私を助けるために必要な情報を提供できます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

回答:


11

これは、QGISに含まれるジオプロセシングツールを使用した比較的単純なタスクです。

  1. LSOAゾーンの面積を計算します。

    • LSOAレイヤー属性テーブルを開きます。
    • 編集モードを有効にします。
    • フィールド計算機を開きます。
    • 式「$ area」で「Decimal number(real)」タイプの新しいフィールドを作成します。
    • 編集モードを無効にします(編集を保存します)。
  2. フラッドゾーンレイヤーを単一のマルチパートフィーチャにマージします。

    • Vector > Geometry Tools > Singleparts to Multipart
    • [ユニークID]フィールドで[---すべてマージ---]を選択します。
  3. LSOAゾーンレイヤーとマルチパートフラッドゾーンレイヤーを交差させます。

    • Vector > Geoprocessing Tools > Intersect
    • 入力層はLSOAゾーン、交差層はフラッドゾーンです。
  4. 結果のレイヤーは、フラッドゾーンレイヤーとオーバーラップしたLSOAゾーンの一部(LSOAゾーンレイヤーの属性を持つ)になります。フラッドゾーン内の各LSOAゾーンの割合を計算するには:

    • 交差したフィーチャの面積を計算し(ステップ#1のように)、次に
    • 別のフィールドを追加し、元の(合計)領域を交差領域で分割します。結果は0〜1の小数です。100を掛けてパーセンテージを求めます。
  5. 両方の層で共有される一意のIDを使用して、元のLSOA層を交差層に結合します。

  6. 結合されたレイヤーを新しいシェープファイルとしてエクスポートします。

  7. 重複した属性を削除します。

ほら!

ステップ2がなければ、LSOA機能ごとに異なるフラッドゾーン機能ごとに個別の機能が作成されます。各LSOAゾーンの合計カバレッジのみに関心がある場合、これはおそらく望みのものではありません。河川/潮//河川の洪水を区別したい場合(および洪水ゾーンデータがそれをサポートしている場合)、一意のIDフィールドとして "TYPE"フィールドを指定してシングルパートをマルチパートに変換できます。


ご協力ありがとうございました!大変感謝いたします。しかし、私はいくつかの問題を抱えています。手順を実行しました。ステップ3、Intersectの完了には10時間かかりましたが、完了したとき、空のシェープファイルしか ありませんでした。プロセスを完了してステップ4を実行しようとしましたが、交差領域を計算するデータがありません。
KJGarbutt

私は以前、洪水層との交差を行うのに問題がありました。機能は大きく複雑です。過去にこれを回避した方法は、それらをより小さな機能に分割することです。そのため、空間インデックスはより多くの作業を実行できます。これを行うには、洪水レイヤー(Vector > Research Tools > Vector Grid... Output grid as polygons)と同じ範囲のベクトルグリッドを作成し、グリッドを洪水レイヤーと交差させます。次に、ステップ3でフラッドレイヤーの代わりに出力を使用します。レイヤーが空だった理由は、クラッシュしたためだと推測しています。
Snorfalorpagus

再度、感謝します。唯一の問題は、ベクトルグリッドを作成しようとするたびにQGISがクラッシュすることです。ここからのアドバイスに従いましたが、毎回クラッシュします。パラメーターを複数回変更し、プロジェクトファイル全体を開いて毎回失敗するのではなく、フラッドゾーンシェープファイルのみを使用してみました。何か案は?!スクリーンショットはこちら
KJGarbutt

指定したXおよびYパラメーターは小さすぎます。あなたも、この複数回行うことができます1000×1000のようなものを、試してみてくださいつまり、最初のx 5000 5000は、ここでは500×500を参照してください関連の回答を作成するために、出力を使用して行います。gis.stackexchange.com/a/66319/12420を
Snorfalorpagus

私はあなたの助けを借りてそれをほぼクラックしました!ただし、元のLSOAレイヤーと交差したレイヤーを結合しようとすると、大量のデータが失われます。作成されたベクトルグリッドの正方形の一部が同じLSOAエリア内にあり、それぞれが同じLSOAコードを持っているためだと思います。したがって、結合を実行すると、LSOAエリアごとに2+パーセントの数値になり、そのうちの1つしか取得できないようです。同じLSOAを持つ各ベクトルグリッドスクエアの各パーセンテージを合計する方法はありますか?
KJGarbutt

6

spatialiteおよび一部の空間SQL関数を使用できます。

Select t1.geometry, t1.ID, area(t1.geometry), area(t2.geometry) ...... (anything you need to have in the table results)

(area(intersection(t1.geometry,t2.geometry))) as "Commun_AREA"

, ("Commun_AREA"*100/(area(t1.geometry))) as "Percent_AREA"

From lsoa as t1, flood_zone as t2

Where Intersects( t1.geometry,t2.geometry ) = 1

3

これは、提出された回答よりもはるかに簡単にできることのように思えます。私は単純なpythonスクリプトを個人的に使用します。

floodName = "the layer name here"
boundryName = "the layer name here"
fieldName = "the name of the field to contain the output 1/0"
minCoverage = 0.5 # the minimum amount of area covered to write 1
updateMap = [] # this will store values to be written    

# get layers
floodLayer = QgsMapLayerRegistry.instance().mapLayersByName(floodName)[0]
boundryLayer = QgsMapLayerRegistry.instance().mapLayersByName(boundryName)[0]
fieldIndex = boundryLayer.dataProvider().fieldNameIndex(fieldName)    

# iterate through boundries
for b in boundryLayer.getFeatures():
    # get only flood features that intersect with this feature's bounding box
    # this will make the script go way faster than it would otherwise
    request = QgsFeatureRequest().setFilterRect(b.geometry().boundingBox())
    floodGeom = geometry()
    floodFeat = QgsFeature()
    iter = floodLayer.getFeatures(request)
    iter.nextFeature(feat)
    while iter.nextFeature(feat):
        floodGeom = floodGeom.combine(feat.geometry())
    intersectGeom = b.geometry().intersection(feat.geometry())
    if intersectGeom.area() > minCoverage * b.geometry().area():
        updateMap[b.id()] = {fieldIndex : 1}
    else:
        updateMap[b.id()] = {fieldIndex : 0}

boundryLayer.dataProvider().changeAttributeValues(updateMap)

これは、各境界レイヤーの境界ボックスと交差する洪水ポリゴンのみを評価するため、実行がかなり速くなり、既存のレイヤーの1つのフィールドのみが更新されます(新しいレイヤー全体を作成して古い値をコピーする複雑な操作の代わりに)その後削除)


2

ステップ3で「Intersect」メソッドを使用してSnorfalorpagusの指示に従ってKJと同じ問題が発生しました。計算にはかなり時間がかかり、残っていたものは空白でした。

Intersectの代わりにQGISで「Clip」メソッドを使用することを除いて、同じ手順を試してみました。したがって、あなたの例では、洪水ゾーンでカバーされていないエリアの部分が残ります。これは何らかの理由で機能しているようで、前のステップの「面積」フィールド計算に加えて、各ポリゴンの残りの部分での新しい「面積」計算を使用して、そうでない各領域の%を計算することができました他のポリゴンレイヤーで覆われています。

それは技術的にはあなたが求めたものの逆です。しかし、そこからものを手に入れる1から各値を減算するだけですされた洪水ゾーンでカバー。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.