私の前回のブログ記事、\/blogs\/tilting\/2017\/06\/10\/a-case-of-missing-prefixes-esris-geometries?sr=search&searchId=c6def5e0-70d7-4799-991e-cfbe7cafee76&searchIndex=0<\/A>は計画外でした。 このブログ記事と次の記事を書き始めたところ、含めたい背景情報がどちらにも完全には合わないことに気づいたので、背景情報を別にまとめました。<\/EM><\/P><\/P>長年にわたり、ArcPy Geometry コンストラクタは特に空のジオメトリのようなエッジケースやニッチなケースで癖があると感じてきました。 開発者へのフィードバック提供が重要だと考える積極的なユーザーとして、ジオメトリコンストラクタに関するいくつかのバグや機能改善要求を提出してきました。 すぐにはいくつが実装されたかは言えませんが、おそらく1つだけで、それも私の希望リストの上位ではありませんでした。<\/P><\/P>数年前にArcPy Geometry クラスコンストラクタで空のジオメトリをサポートするというアイデアを提出しました。 空のジオメトリを扱うユーザーが非常に少ないことを考えると、これまでにわずか2票しか得ていないことに驚きはありません。 <\/EM>Esri のDavid Wynne<\/A>がコメントで指摘しているように、空のジオメトリは実際には ArcPy Geometry コンストラクタでサポートされていますが、その構文は文書化されていません。 コンストラクタで空のジオメトリがサポートされていることから、私の元のアイデアはPythonic ArcPy Geometries<\/A>に統合されるべきだと思います。なぜなら私が本当に求めているのは ArcPy Geometry コンストラクタを使って空のジオメトリをより直感的かつ慣用的に作成する方法だからです。 もしできるならこの2つのアイデアを統合したいですが、自分ではできず、単にアイデアを削除したくもありません。<\/EM><\/P><\/P>ArcPy Polygon クラスを例に取り、ArcPy Geometry コンストラクタを使って空のジオメトリを構築しようとする様々な方法を見てみましょう:<\/P>>><\/SPAN>><\/SPAN> ctor_stmts =<\/SPAN> (<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> ''<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'None'<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'arcpy.Array()'<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'arcpy.Array(None)'<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'arcpy.Point()'<\/SPAN>,<\/SPAN>.<\/span>.. :<\/SPAN> Object:<\/SPAN> CreateObject は .<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> を作成できません04<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Polygon(<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>None)<\/SPAN>)<\/SPAN> :<\/SPAN> MULTIPOLYGON EMPTY05<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Polygon(<\/SPAN>arcpy.<\/SPAN>Point(<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> MULTIPOLYGON EMPTY06<\/SPAN>.<\/SPAN> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>[<\/span>]<\/span>)<\/span>)<\/span> :<\/span> Object:<\/span> CreateObject は .<\/span>.<\/span>.<\/span>.<\/span> を作成できません07<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>[None])<\/span>)<\/span> :<\/span> MULTIPOLYGON EMPTY08<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>arcpy.<\/span>Array(<\/span>))<\/span>)<\/span>)<\/span> :<\/span> MULTIPOLYGON EMPTY09<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>arcpy.<\/span>Array(<\/span>None))<\/span>)<\/span> :<\/span> MULTIPOLYGON EMPTY10<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/</spam>An array of empty arrays or None values results in MULTIPOLYGON EMPTY.>> > ...
<\/P>
長年にわたり、ArcPy Geometry コンストラクタは特に空のジオメトリのようなエッジケースやニッチなケースで癖があると感じてきました。 開発者へのフィードバック提供が重要だと考える積極的なユーザーとして、ジオメトリコンストラクタに関するいくつかのバグや機能改善要求を提出してきました。 すぐにはいくつが実装されたかは言えませんが、おそらく1つだけで、それも私の希望リストの上位ではありませんでした。<\/P>
数年前に
>><\/SPAN>><\/SPAN> ctor_stmts =<\/SPAN> (<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> ''<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'None'<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'arcpy.Array()'<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'arcpy.Array(None)'<\/SPAN>,<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> 'arcpy.Point()'<\/SPAN>,<\/SPAN>.<\/span>.. :<\/SPAN> Object:<\/SPAN> CreateObject は .<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN> を作成できません04<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Polygon(<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>None)<\/SPAN>)<\/SPAN> :<\/SPAN> MULTIPOLYGON EMPTY05<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Polygon(<\/SPAN>arcpy.<\/SPAN>Point(<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> MULTIPOLYGON EMPTY06<\/SPAN>.<\/SPAN> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>[<\/span>]<\/span>)<\/span>)<\/span> :<\/span> Object:<\/span> CreateObject は .<\/span>.<\/span>.<\/span>.<\/span> を作成できません07<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>[None])<\/span>)<\/span> :<\/span> MULTIPOLYGON EMPTY08<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>arcpy.<\/span>Array(<\/span>))<\/span>)<\/span>)<\/span> :<\/span> MULTIPOLYGON EMPTY09<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/span>Array(<\/span>arcpy.<\/span>Array(<\/span>None))<\/span>)<\/span> :<\/span> MULTIPOLYGON EMPTY10<\/span>.<\/span> arcpy.<\/span>Polygon(<\/span>arcpy.<\/</spam>An array of empty arrays or None values results in MULTIPOLYGON EMPTY.>> > ...
コメントや意見を共有する前に、まずArcPy Polygonのドキュメントを正確に復習することが重要だと思います:
構文 Polygon (inputs, {spatial_reference}, {has_z}, {has_m}) パラメーター 説明 データ型 inputs オブジェクトを作成するために使用される座標。データ型はorオブジェクトのいずれかです。 Object
Polygon (inputs, {spatial_reference}, {has_z}, {has_m})
オブジェクトを作成するために使用される座標。データ型はorオブジェクトのいずれかです。
コメントの前にいくつかの観察点:
>><\/>><\/> # 一般的な組み込みデータ構造>><\/>><\/> list(<\/>)<\/>[<\/>]<\/>>><\/>><\/> set(<\/>)<\/>set(<\/>[<\/>]<\/>)<\/>>><\/>><\/> dict(<\/>)<\/>{<\/>}<\/>>><\/>><\/> str(<\/>)<\/>''>><\/>><\/> >>></span><span class='operator token'></span><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>What is more Pythonic for creating an empty geometry, arcpy.Polygon(arcpy.Array(None)) or arcpy.Polygon()? UPDATE 06/2018:For the sake of completeness, I want to include the results of running the constructor tests on the other ArcPy Geometry classes:>>> geometry_classes = ["point", "multipoint", "polyline"] >>> ctor_stmts = ( '', 'None', 'arcpy.Array()', 'arcpy.Array(None)', 'arcpy.Point()', 'arcpy.Array([])', 'arcpy.Array([None])', 'arcpy.Array(arcpy.Array())' class="punctuation token">, 'arcpy.Array(arcpy.Array(None))', 'arcpy.Array(arcpy.Array([]))')>>> for geometry in geometry_classes:... for i, stmt in enumerate(ctor_stmts):... stmt = "arcpy.Geometry('{}',{})".format(geometry, stmt)... try:... print("{:0>2}. {:<60}: {}".format(i.<\/SPAN>配列(<\/SPAN>)<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> オブジェクト:<\/SPAN> CreateObject.<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN>09<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'point'<\/SPAN>, <\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>None)<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> オブジェクト:<\/SPAN> CreateObject.<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN>10<\/SPAN>.<\/Span> arcpy.<\/Span>Geometry('point',/arcpy./Array(/arcpy./Array([] ))) .<\/SPAN>.<\/SPAN>.<\/SPAN>02<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'polyline'<\/SPAN>,<\/SPAN>None)<\/SPAN> :<\/SPAN> オブジェクト:<\/SPAN> CreateObject.<\/SPAN>.<\/SPAN>.<\/SPAN>.<\/SPAN>03<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>Geometry(<\/SPAN>'polyline'<\/SPAN>,<\/SPAN>arcpy.<\/SPAN>Array(<\/SPAN>)<\/SPAN>)<\/SPAN> :<\/SPAN> オブジェクト:<\/SPAN> CreateObject.<\/Span>.<\/span>.<\/span>.<\/span>04<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'polyline'<\/span>,<\/span>arcpy.<\/span>Array(<\/span>None)<\/span>)<\/span> :<\/span> MULTILINESTRING EMPTY05<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'polyline'<\/span>,<\/span>arcpy.<\/span>Point(<\/span>)<\/span>)<\/span> :<\/span> MULTILINESTRING EMPTY06<\/span>.<\/span> arcpy.<\/span>Geometry(<\/span>'polyline'<\/span>,<\/span>arcpy.<\/span>Array(<\/span>[])<\/span>)<\/span> :<\/span> オブジェクト : < / Span > CreateObject < Span Class = "Punctuation Token" > . < / Span > < Span Class = "Punctuation Token" > . < / Span > < Span Class = "Punctuation Token" > . < / Span > < Span Class = "Punctuation Token" > . < / Span > 07 < / span >< span Class = "Punctuation Token" > . < / span > arcpy < span Class = "Punctuation Token" > . < / span > Geometry < span Class = "Punctuation Token" > ( < / span >< span Class = "String Token" > 'polyline' < / span >< span Class = "Punctuation Token" > , < / span > arcpy < span Class = "Punctuation Token" > . < / span > Array < span Class = "Punctuation Token" > ( < / span > [ None ] < span Class = "Punctuation Token" > ) < / span >< span Class = "Punctuation Token" > ) < / span >& nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; & nbsp ; : MULTILINESTRING EMPTY 08 < / span >< span Class = "Punctuation Token" > . < / span > arcpy < span Class = "Punctuation Token" > . < / span > Geometry < span Class = "Punctuation Token" > ( < / span >< span Class = "String Token" > 'polyline' < / span >< span Class = "Punctuation Token" > , < / span > arcpy < span Class = "Punctuation Token" > . < / span > Array < span Class = "Punctuation Token" > ( < / span > arcpy < span Class = "Punctuation Token" > . < / span > Array < span Class = "Punctuation Token" > ( < / span >< span Class = "Punctuation Token" > ) < / span >< span Class = "Punctuation Token" > ) < / span >< span Class = "Punctuation Token" > ) < / span >& nbsp ; & nbsp ; : MULTILINESTRING EMPTY 09 < / span >< span Class = "Punctuation Token" > . < / span > arcpy < span Class = "Punctuation Token" > . < / span > Geometry < span Class = "Punctuation Token" > ( < / span >< span Class = "String Token" > 'polyline' < / span >< span Class = "Punctuation Token" > , < / span > arcpy < span Class = "Punctuation Token" > . < / span > Array < span Class = "Punctuation Token" > ( < / span > arcpy < span Class = "Punctuation Token" > . < / span > Array < span Class = "Punctuation Token" > ( < / span > None < span Class = "Punctuation Token" > ) </ Span >< Span Class=
>>> geometry_classes = ["point", "multipoint", "polyline"] >>> ctor_stmts = ( '', 'None', 'arcpy.Array()', 'arcpy.Array(None)', 'arcpy.Point()', 'arcpy.Array([])', 'arcpy.Array([None])', 'arcpy.Array(arcpy.Array())' class="punctuation token">,
Nice job Joshua... sadly 'None' still isn't from previous discussions, nothing has changed
Joshua Bixby / Dan Patterson
Do you know how you would invoke the 'within' method? Been struggling with that one.
It's on the Geometry site, but, alas no good sample 😕 Geometry—Help | ArcGIS for Desktop
In the Pro help... still applies to ArcMap http://pro.arcgis.com/en/pro-app/arcpy/data-access/searchcursor-class.htm
Andrew Valenski, I responded in your cross post: Arcpy write geometry error. Instead of cross-posting the same question to slightly-related, existing discussions, it would have been better in this case to just post a new question with a bit more information. I see you started a new question: https://community.esri.com/thread/197968-re-how-to-use-arcpy-geometry-measureonline
In GeoNet, instead of cross posting you can post your question in one space/place and share that question in other spaces/places. That allows the question to get higher visibility without creating multiple, independent versions of the same question that can lead to confusion.
This is an excellent analysis @JoshuaBixby!
Most important thing is that technique for creation of empty geometries should be noted in the docs at least, and even better should be made consistent with other Pythonic methods of creating empties...
サインインしたメンバーは投稿、更新のフォローなどができます。初めてですか?無料アカウントを登録してください。
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.