一般的なGISのポリゴン頂点の順序:時計回りまたは反時計回り


23

2日前に、ESRIシェープファイルのポリゴンの頂点の内部保存順序について質問しました。その質問は回答されました(ポリゴンはシェイプファイルに時計回りまたは反時計回りに保存されていますか?)、また古い投稿で回答されました(ポリゴン作成(時計回りの回転かどうか)

しかし、今では私の質問はより一般的であり、独自の答えがあるかどうかはわかりません。時計回りの順序はESRIシェープファイルのみですか、それとも一般的なGIS形式ですか?また、GISソフトウェアの内部表現についてはどうですか?たとえば、QGISを使用し、ポリゴンを含む* .shpを読んだ場合、外側の境界の内部表現は元のシェープファイルのように時計回りであると仮定しますが、QGISでサポートされているすべてのファイル形式はどうでしょうか?ArcGISの場合はどうですか?また、ポリゴンが反時計回りに保存されているファイル形式が存在する場合、これらのファイルがQGIS、ArcGISなどにロードされると、内部で方向が変更されるため、たとえばPyQGISを使用してデータを読み取ると、ポリゴンは時計回りになります順序付けられました?

私の目的はQGISのプラグインを作成することですが、データのソースはESRIシェープファイルまたはその他の形式にすることができます。方位角を使用してポリゴンの連続する側面間の角度を確認する必要があるため、順序が時計回りであるかどうかを知る必要があります。1つの解決策は、各ポリゴンの面積を計算することです。正しく覚えていれば、正の場合は順序は時計回りになり、負の場合は順序は反時計回りになります。

面積計算は集中的なタスクではないため、プラグインをそれほど遅くすることはありません。しかし、QGISの特殊なケースでは、元のソースの順序に関係なく、ポリゴンを時計回りに保存するか反時計回りに保存するかを誰もが知っていますか?これまでにESRIシェープファイルを使用しており、layer.getFeatures()。geometry()。asPolygon()の座標は、外側の境界線では時計回りに、穴の場合は反時計回りに、つまり元の* .shpのように保存されます。


データの保存方法によって異なります。Oracleは反時計回りですgis.stackexchange.com/questions/20817/…–
マッパーズ

@Mapperz、あなたのリンクはdocs.oracle.com/cd/B10501_01/appdev.920/a96630/…につながりますPolygons are oriented correctly. (Exterior ring boundaries must be oriented counterclockwise, and interior ring boundaries must be oriented clockwise.)。これは、Oracleが反時計回りであることを明確に示しています。
user30184

回答:


27

[こちら]からダウンロードできるOGC仕様(http://www.opengeospatial.org/standards/sfs)には次のように記載されています。

「ポリゴンの回転はこの規格では定義されていません。実際のポリゴンの回転は、時計回りまたは反時計回りの方向になる場合があります。」

Oracleドキュメント、明らかに外部リングの境界は反時計回り、および内部リングの境界、時計回りに向いていることが述べられています。同様に、SQL Server Spatialでは、geographyデータ型は外部リングでは反時計回りの規則に従い、内部リングでは時計回りの規則に従います。詳細については、このMicroSoftブログを参照してください。Postgisはジオメトリに対してどちらの方法でも許可しているようで、ポリゴンのジオメトリを右手または左手のいずれかのルールに従うように強制する機能があります。ST_ForceRHRおよびForceLHRを参照してください。JTS / Geosは右手の規則、つまり、外側のリングの時計回りの方向に従っているようであるため、実際には少し不明瞭です。

一般に、地理データ型が方向を強制するのは理にかなっています。さもないと、小さなポリゴンがそれだけであるのか、全世界ポリゴンの内輪であるのかを判断することができません。平面上のジオメトリデータ型では、この混乱は発生しません。外側のリングと内側のリングが順番に続くためです。リングが1つしかない場合は、グローブとは異なり、(向きが何であれ)囲みます。 、それは丸く包みます。


@mxfhのコメントから:OGCのOpenGIS Simple Features Access(ISO 19125-1)は、バージョン1.2.1のドキュメント[OGC 06-103r4] 6.1.11.1/page 26からopengeospatial.orgの外側のリングの反時計回りの方向を指定します。/ standards / sfa。変更は、最新の2006年にバージョン1.1.0と1.2.0の間に導入されました。あなたが引用している脚注は2005年以降更新されていません


良い答えはジョン。ノードの順序を使用して内部リングと外部リングを識別することがベクトルデータ形式でそれを達成できる唯一の方法であるかどうかはわかりません。ただし、何らかのメカニズムを導入する必要があることに同意します。たとえば、GeoJSONでは、ノードの最初のリストが外部として指定され、後続のリストはすべて内部の穴になります。それは(それ以上ではないにしても)効果的に機能します。
WhiteboxDev 14年

はい、これはジオメトリのWKTにも当てはまります。地域にとっては明らかに重要です。
ジョンパウエル14年

それは非常に本当です;)
WhiteboxDev 14年

@WhiteboxDevネストされたリングの巻き順が交互になっている理由は、Shoelaceメソッドで面積を計算すると、リングの方向に応じて符号付き面積が計算されるためです。一般に、1次のネストされたリングは穴と見なされ、外側のリングの方向が交互に変わります。それらの寄与面積値は負です。外輪が正である場合; 偶数次のネストされたリングも同様です。したがって、すべてのリングフィーチャの合計面積は、すべての署名された面積の合計です。
mxfh

1
@mxfh:厳密に言えば、「ネストされたリングの巻き順」は、OCG(および他の多くの)ポリゴンでは意味がありません。許可されていないためです。別の「穴」内のネストされたポリゴンを表す方法は、MultiPolygonを使用することです。この場合、各構成ポリゴンは元のワインディングルールに従います。OK、OK:これは、「入れ子になったLinearRings」の巻きを交互にすることに相当します...しかし、これは、PolyPolygonではなく、それ自体がMultiPolygonの定義を可能にすることを示しています。
ダンH

23

境界はその方向に沿って境界の左と右の2つの領域を定義するため、有限の表面をカバーする地理座標系のあいまいさを防ぐために、リング(境界)方向が必要です。これら2つの領域のどちらが大きいかを判断することは可能ですが、それでもあいまいさは残ります。

仕様ごとのさまざまな形式のポリゴンの外側リング方向の概要を次に示します。

シェープファイルと単純な機能の巻き順の図

  • WKT / GML / KMLおよびさまざまなSQL実装でも使用されるSimple Feature Access(ISO 19125-1):

    • 外部リング:反時計回り
    • 内部リング(穴):時計回りの方向。

    ポリゴンは、1つの外部境界と0個以上の内部境界によって定義される平面サーフェスです。各内部境界は、ポリゴンの穴を定義します。[...]

    外部境界線LinearRingは、外部境界線が反時計回り方向に境界線を横切るように見える表面の側面である表面の「上部」を定義します。インテリア LinearRingsは反対の方向性を持っている、ととして表示されます時計回りに「トップ」から見たとき... シンプルな機能アクセススペック

    ほとんどの実装では、POLYGONのリングの順序が重要です(シェープファイルとは対照的に)

    穴のあるポリゴンの場合、最初のサブ要素は外部リング、2番目のサブ要素は1番目の内部リング、3番目のサブ要素は2番目の内部リングなどとなります。Oracle Spatial

    より深いネスティング、別名島の湖-島-...は、MultiPolygonsとして表される必要があります(図2.10(4)を参照)。定義されていません。

  • ESRI Shapefiles / SHP

    • 外部リング:時計回り
    • 内部リング:反時計回り

    ポリゴンは、1つ以上のリングで構成されます。リングは、閉じた自己交差しないループを形成する4つ以上のポイントの接続シーケンスです。ポリゴンには、複数の外側のリングが含まれる場合があります。頂点の順序またはリングの向きは、リングのどちら側がポリゴンの内部であるかを示します。頂点の順序でリングに沿って歩く観察者の右側の近傍は、ポリゴン内の近傍です。多角形のを定義するリングの頂点は反時計回りの方向にあります。したがって、単一の環状ポリゴンの頂点は常に時計回りの順序になります。[...]

    ポイント配列内のリングの順序は重要ではありません。ESRIホワイトペーパー

    複数の外側の境界が許可されているため、このポリゴン定義では、島の島の構成が可能です。トポロジー的に、湖の島は時計回りのもう1つの外側のリングになります。これにより、ESRIシェイプファイルポリゴンがシンプルフィーチャマルチポリゴンになります。

    ポイントの順序を正しく設定しないと、ポリゴンが重なってしまいます。pyshp

  • GeoJSON(RFC7946)

    注:オリジナルのGeoJSON 2008仕様には、巻き順が適用されていません

    • 巻き順:外部リングは反時計回りです(右手の法則)
    • 内部リングは時計回りです
    • リングの順序は重要です:

      複数のリングを持つポリゴンの場合、最初のリングは外部リングでなければならず、その他のリングは内部リングまたは穴でなければなりません。GeoJSON仕様

  • TopoJSON:デフォルトで外部リングを時計回りに強制します

シェープファイルと単純な機能の巻き順の図

遠足:

入れ子になったリングの巻き順が交互になる理由の数学的な理由は、靴ひも式視覚的説明)で面積を計算すると、リングの方向に応じて符号付き面積が計算されるためです。

一般に、入れ子になったリング(内部境界)は穴と見なされ、外側のリングとは異なる方向になります。寄与している署名された面積の値は負です。外輪が正である場所。すべてのリングフィーチャの合計面積は、すべての署名済み面積の合計です。

ESRIで実装されているように、このナレッジベースエントリを参照してください。ArcGISがポリゴンの領域を決定するために使用するアルゴリズムは何ですか?

ニーモニックの提案

矢印として解釈されるレターフォームの開いた端:

  • S hapefile:S→ᔑ→↻
  • 簡単F E ATUR E S:E→ᘓ(外側CC-ワイズ巻線)→↺
  • GeoJSON:G(Gの幹は矢印)→↺

4

ベクターファイルの形式はそれぞれ異なり、GISの内部でのデータの処理方法も異なるため、誰もがあなたの質問に対する決定的な答えを提供できることを知りません。しかし、時計回りの順序はESRIシェープファイルだけのものではないことを確信できます。外部リングには時計回りの順序、内部穴ポリゴンには反時計回りの同様の指定を使用する他の形式があります。たとえば、JTSベクトルポリゴン構造は同様の形式を使用します。実際、歴史的にはこれはESRIアプローチに似ていたとここに述べられています。また、すべての形式にこの要件があるわけではない、と断言できます。たとえば、GeoJSON形式の仕様ポリゴン形式での頂点の順序について、そのような要件はありません。KML仕様、実際の状態:

forポリゴンは反時計回りに指定する必要があります。ポリゴンは「右手の法則」に従います。これは、座標が指定されている方向に右手の指を置くと、親指がポリゴンの幾何学的法線の一般的な方向を指すことを示します。

そのため、すべてのオプションが存在し、そこに実装されています。それは野生の世界です!


1
KMLの「右手規則」は、従来「左手規則」と呼ばれていたものであることに注意してください(腕を伸ばして周囲を歩くと、左手が図の内側になります)。Esriには複数のアプローチがあります。これは、シェープファイルが右手ルールを使用する唯一の形式であるためです(エンタープライズジオデータベースは内部で左手ルールを使用しますが、「C」APIを使用すると、どちらの順序でもリクエストできます)。GMLで必要なのは、内部リングが外部リングと逆の順序であり、最初のリングが外部であることだけです。
ビンス14年

@Vince私はそれを知りませんでした。ナッツじゃない?知らせてくれてありがとうございます。GMLのアプローチが何よりも好きだと思います。それらが反対である限り、順序は重要ではありません。それはとても理にかなっています。
WhiteboxDev 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.