<\/HEAD>
これは、ソフトウェアユーザーが不十分なドキュメントによって被るリスクについての2部構成シリーズの第1部です。具体的には、GISソフトウェアにおける空間演算子のドキュメントが弱いために生じる混乱や予期しない結果についてです。 シリーズの第1部では<\/STRONG>、一貫性がなく不完全なドキュメントがユーザーに空間演算子の実装方法を推測させる必要があることを見ています。 シリーズの第2部では、異なる実装の空間演算子を混在させた場合に生じる一貫性のない結果について考察しています。<\/EM><\/P><\/P>
前回のブログ投稿から9か月が経ちましたが、GeoNetが立ち上げられたときに目指していたペースとは言えません(少なくともGeoNetの決議を新年の決議より重視はしていません<\/EM>)。 私の停滞が解消されたかはわかりませんが、Esriによって生々しい神経が強く刺激され、一時的にでも雨が降ったようです。 私のクローゼットに散らばる多くの石鹸箱の中で、不十分なドキュメントとその結果は最も使い古されたものの一つです。 正直なエイブラハムがインターネット上のすべてを信用できないと言う一方で、私はソフトウェアユーザーは企業のオンラインヘルプやドキュメントを信頼できるべきだと思います。<\/P><\/P>空間関係の世界であまりにも長く過ごすと、Dimensionally Extended 9 Intersection Model (DE-9IM) に出会わずにはいられません。 DE-9IMは90年代半ばにClementiniらによって4 Intersection Model (4IM) と9 Intersection Model (9IM) の進化形として開発されました。 DE-9IMは空間関係の唯一の定義ではありませんが、
OpenGIS Implementation Specification for Geographic information - Simple feature access - Part 1: Common architecture に含まれたことで2D定義として主流になりました。<\/P><\/P>以前はEsriの様々なドキュメントでDE-9IMへの言及や議論が見られましたが、現在のArcGISドキュメントではそれらの言及やドキュメントを見つけることが難しくなっています。 例えば、新しい10.3版のArcGIS for Desktop、ArcGIS for Server、およびArcGIS for Developers サイト間で、Clementiniへの言及は数ページのみであり、DE-9IMへの言及と議論は1ページだけです:Relational functions for ST_Geometry。 Pythonには「私たちは皆大人だ」という哲学がありますが、Esriは逆方向に進んでおり、ビタミン強化なしでパブラムを与えているようです。<\/P><\/P>DE-9IMは多くのジオメトリライブラリや地理空間アプリケーションにおける2D空間述語/関係の基礎ですが、Select Layer By Location ツールにはEsriのデフォルト実装がClementiniと異なる2つのオーバーレイタイプがあります:Contains, Within。 両方の場合で、デフォルトまたは無修飾オーバーレイタイプはEsri定義(青色下線)を示し、一方Clementini定義(赤色下線)は修飾子を通じて扱われます。<\/P>
<\/P>では、Esri定義のContainsとWithinはClementini定義とどう違うのでしょうか? 数学的表記や行列図示を省略すると、その違いはジオメトリ境界の扱い方に集約されます。 例えば、ジオメトリ a がジオメトリ b の境界上に完全にある場合、それはEsri定義ではジオメトリ b のWithinとみなされますが、Clementini定義ではWithinとはみなされません。 簡単なポリゴンとラインフィーチャーを作成して説明しましょう:<\/P><\/P>>>> polygon = arcpy.FromWKT('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))')
>>> line = arcpy.FromWKT('LINESTRING(1 0, 2 0)')
>>> arcpy.CopyFeatures_management(polygon, 'in_memory\/polygon')
<Result 'in_memory\\polygon'>
>>> arcpy.CopyFeatures_management(line, 'in_memory\/line')
<Result 'in_memory\\line'><\/PRE><\/P><\/P>
<\/P>両方のWithin定義を使ってSelect Layer By Location ツールを実行します:<\/P><\/P>>>> arcpy.SelectLayerByLocation_management("line", "WITHIN", "polygon")
<Result 'line'>
>>> arcpy.GetCount_management("line")
<Result '1'>
>>> arcpy.SelectLayerByLocation_management("line", "WITHIN_CLEMENTINI", "polygon")
<Result 'line'>
>>> arcpy.GetCount_management("line")
<Result '0'><\/PRE><\/P>ここまでは順調です。 Esriのデフォルト定義であるContainsとWithinが他の多くのジオメトリライブラリや地理空間アプリケーション(OGC simple feature standardsを含む)と異なるという事実を除けば、少なくとも結果はオンラインで入手可能な乏しいドキュメントと一致しています。<\/P><\/P>ここで非常に重要なのは見落とされやすい点です。 EsriのST_Geometry関数はOGC simple feature accessおよびSQL標準に準拠しており、それはST_Within関数がEsri定義ではなくClementini定義に従っていることを意味します。<\/P><\/P>SQL> SELECT sde.st_within(sde.st_geomfromtext('LINESTRING(1 0, 2 0)', 0),
2 sde.st_geomfromtext('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 0))
3 FROM dual;
SDE.ST_WITHIN(SDE.ST_GEOMFROMTEXT('LINESTRING(10,20)',0),SDE.ST_GEOMFROMTEXT('PO
--------------------------------------------------------------------------------
& nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;+ & nbsp;}\u003c/P\u003e\u003cP\u003eこれまで述べてきたように、Esri の空間関係に関するドキュメントは推測に大きく依存しているため弱いと言えます。注意深いユーザーならばSelect Layer By Location ツールのドロップダウンボックス内に複数のWithinオーバーレイタイプがあることに気づくでしょうし、好奇心旺盛なユーザーならばそれらオーバーレイタイプについて調べて違いを理解しようとするでしょう。本当に注意深く知識豊富なユーザーならばWhat is the ST_Geometry storage type? ドキュメント内でST_GeometryがSQL 3仕様を実装しているという一文からST_Within関数はSelect Layer By Location ツール内Esri定義ではなくClementini定義に従うことを理解できるでしょう。要するに、Esri自身のソフトウェア内でも特定空間関係には異なる定義が存在することを明確に認めるドキュメントは存在しません。<\/>\u003c/P\u003e\u003cP\u003e混乱していますか?\u00a0まだ待ってください。本当のおもしろさはArcPy Geometry Classes<\ /A> に踏み込んだ時から始まります。そこではドキュメントは弱いどころか非常に弱くなります。ArcPy Geometry Classes ドキュメント内でOGCへの言及はWKBおよびWKTプロパティのみであり、DE-9IMやClementiniへの言及はありません。within メソッドのドキュメントを見てみましょう:<\/>\u003c/P\u003e\u003cP style=\"padding-left: 60px;\">
<\/P>つまり、ジオメトリは別のジオメトリの中にあれば、そのジオメトリの中にあるということです。理解しました。あれ、彼らは私にジオメトリが別のジオメトリの中にあるかどうかを尋ねているのでしょうか?イラストのどれもEsriとClementiniの定義を区別する状況を捉えていませんが、OGC、DE-9IM、またはClementiniへの言及がないことから、Esriの定義が使われていると思われます。確認してみましょう:<\/P>
<\/P>
>>> line.within(polygon)
False<\/PRE><\/P>うーん、それは痛いですね。Esriのソフトウェアのさまざまな部分で特定の空間演算子の実装に一貫性が欠けていることはかなり明らかですが、一番悪いのはドキュメントがそれを指摘していないことです。ユーザーは推測に頼らざるを得ず、時には誤ってソフトウェアの動作を理解してしまう可能性があります。Caveat utilitor<\/EM>。<\/P><\/BODY><\/HTML>