ArcGIS for Desktopを使用してポイントフィーチャの周囲に正方形のバッファーを作成しますか?


31

ポイントフィーチャからスクエアバッファーを作成したいのですが、そこに入るコードがわかりません。

forums.esriのWebサイトでも同様の質問が寄せられていますが、それは10年以上前のことであり、コードを試してもうまくいきませんでした。

ポイントフィーチャからスクエアバッファーを作成するにはどうすればよいですか?


gis.stackexchange.com/questions/12479/…は本質的に重複しています(この質問の一般化に対処しているため)それらをマージするのではなく、分離します。しかし、さらに多くのソリューションが必要な場合は、他のスレッドもお読みください!
whuber

2
OKありがとう 昨日このウェブサイトを見つけたばかりで、今でも慣れています。私は将来の投稿/質問でそれをやろうとします。このサイトは、ArcGISフォーラムよりもずっと気に入っています。
キンボール

私は、そのコメントを批判としての意味ではありませんでした、キンボール:2つのスレッドのマージを防ぐためにありました。それだけです。コミュニティへようこそ!(そして、ArcGISフォーラムで特に私たちについて友達に教えてください。:-)
whuber

右。私はあなたがそのようにそれを意味しなかったことを知っています。私はこのコミュニティをとても楽しんでおり、すでにこの新しいフォーラムについて他の人に話し始めています。
キンボール

あなたの重要なシェアをありがとう。ポイント機能でフィールドデータのセットを使用して、座標を手動で入力せずに、指定したスクリプトを使用して長方形バッファーを作成する方法を考えています。ありがとう

回答:


47

ArcMap 10で次の手順を試してください。

  1. ポイントフィーチャをバッファリングします(ArcToolbox> Analysis Tools> Proximity> Buffer)。[線形単位]ボックスで正しい距離を選択してください。
  2. 新しく作成したバッファを[ フィーチャエンベロープからポリゴン]ツールに入力します([データ管理ツール]> [フィーチャ]> [フィーチャエンベロープからポリゴン])。複数のポイントがある場合は、[マルチパートフィーチャの作成]ボックスを選択してください。

Pythonソリューションの場合:

SearchCursorとInsertCursorを使用して正方形のバッファーを作成する

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


2
ソリューションの動作を示す+1返信が最適です。
whuber

12

可能な解決策は、標準のESRIバッファーツールを使用して任意の半径で「通常の」ラウンドバッファーを作成し、その結果得られるバッファーのフィーチャクラスに対してフィーチャエンベロープからポリゴンを実行することです。これにより、各フィーチャの範囲の周りに正方形のエンベロープフィーチャが作成されます。ポリゴンへの機能エンベロープは、[データ管理]> [機能]にあります。モデルビルダーモデルは次のようになります。

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


優れたソリューション!また、バッファーの出力をin_memoryレイヤー(in_memory \ tmpBuffer)として作成することにより、不要なデータをディスクに書き込むことを回避し、プロセスをより高速にすることができます。
ライアンダルトン

9

Aaronのコードの最後にリンクされたスクリプトは、スクエアバッファーにのみ使用でき、新しいarcpy.daモジュールを使用しないため、長方形バッファーの作成に使用できるスクリプトを作成しました。10kのランダムポイントデータセットでは、10秒で完了しました。

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

import os, arcpy

point_FC = arcpy.GetParameterAsText(0)
w = float(arcpy.GetParameterAsText(1))
h = float(arcpy.GetParameterAsText(2))
output_FC = arcpy.GetParameterAsText(3)

def rect(coord, w, h):
        #Given XY coordinates and rectangle dimensions,
        #return a polygon object of a rectangle centered about the point
        x,y = coord
        w *= 0.5
        h *= 0.5
        xmin,xmax = x-w, x+w
        ymin,ymax = y-h, y+h
        poly = ((xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin))
        return arcpy.Polygon(arcpy.Array(arcpy.Point(*p) for p in poly))

#Create output feature class.
spatref = arcpy.Describe(point_FC).spatialReference
folder, base = os.path.split(output_FC)
arcpy.CreateFeatureclass_management(folder, base, "POLYGON", spatial_reference=spatref)

#Get field object for every field in input except OID and Shape.
fields = [f for f in arcpy.ListFields(point_FC) if f.type not in ("OID", "Geometry")]

for field in fields:
         arcpy.AddField_management(output_FC, field.name, field.type, field.precision,
                                   field.scale, field.length, field.aliasName,
                                   field.isNullable, field.required, field.domain)

#Get field names to be inputted to cursors.
#Need SHAPE@XY token to read point coords and SHAPE@ token to write polygon coords.
fnames = [f.name for f in fields]
fields_in = fnames[::]
fields_out = fnames[::]
fields_in.append("SHAPE@XY")
fields_out.append("SHAPE@")

#Create buffers and write attributes to output FC, if any.
count = int(arcpy.GetCount_management(point_FC)[0])
arcpy.SetProgressor("step", "Buffering...", 0, count, 1)
with arcpy.da.SearchCursor(point_FC, fields_in) as Scursor,  arcpy.da.InsertCursor(output_FC, fields_out) as Icursor:
        for i,row_in in enumerate(Scursor):                
                #"Convert" point to rectangle
                arcpy.SetProgressorPosition(i)
                feature = list(row_in)
                feature[-1] = rect(feature[-1], w, h)                
                Icursor.insertRow(feature)


1

アーロンの答えに代わるものとして、アドバンスドライセンスがない人には、最小境界ジオメトリツールを使用します。以下の手順(Aaronから変更):

  1. ポイントフィーチャをバッファリングします(ArcToolbox> Analysis Tools> Proximity> Buffer)。[線形単位]ボックスで正しい距離を選択してください。
  2. 新しく作成したバッファを最小境界ジオメトリツールに入力します([データ管理ツール]> [機能]> [最小境界ジオメトリ])。「RECTANGLE_BY_AREA」または「RECTANGLE_BY_WIDTH」を使用します。他のオプションは、アドバンストライセンスでのみ使用可能です。

編集:このオプションでは、「ENVELOPE」オプション(高度なライセンスが必要)を使用せずに、結果の正方形バッファーの方向を制御できません。[出力に属性としてジオメトリ特性を追加(オプション)]オプションにチェックを入れると、結果のオフセットは出力フィーチャクラスに「MBG_Orientation」として記録されます。必要に応じて、これを使用してフィーチャを回転させて中心に戻すことができます。ArcPyを使用して属性テーブルから値でポリゴン回転するをご覧ください。それに対する潜在的な解決策のために。

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


私の特定のフィーチャクラスでは、このワークフローを使用して正方形をさまざまな方向に回転させます。バッファーサークルが重複しているからでしょう。わからない。同じフィーチャクラスでEsriが上記のアーロンのメソッドを使用するようにしましたが、バッファリングされた円は回転しませんでした。
アンドリュー

@Andrew、そうですね、それはアドバンストライセンスなしのツールの制限です。ENVELOPEオプションを使用すると、上記のAaronの方法と同じ結果が返されますが、アドバンスライセンスも必要です。潜在的な回避策は、「属性としてジオメトリ特性を追加」オプションにチェックマークを付け、それらが傾いている量を見つけて(一貫している必要があります)、編集セッションでその量だけ結果の正方形バッファーを回転させることです。まだ試していません。
デンカーン

0

このサイトでは、geographiclib JavaScriptとjs2shapefileを使用してcsvを正方形または長方形または円形のバッファーに変換する方法について説明します。

それがあなたの問題を解決するかどうかを見ることができます。

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