Membuat buffer persegi di sekitar fitur titik menggunakan ArcGIS untuk Desktop?

31

Saya ingin membuat buffer persegi dari fitur titik tetapi saya tidak mengerti kode yang masuk ke dalamnya.

Pertanyaan serupa telah diajukan di situs forums.esri tetapi itu sudah lebih dari 10 tahun yang lalu, dan itu tidak berhasil ketika saya mencoba kode tersebut.

Bagaimana cara membuat buffer persegi dari fitur titik?

Kimball
sumber
gis.stackexchange.com/questions/12479/… pada dasarnya adalah duplikat (karena membahas generalisasi dari pertanyaan ini), tetapi karena sudah ada jawaban yang baik di sini yang khusus untuk penyangga persegi, sepertinya yang terbaik adalah membiarkan kedua utas terbuka dan pisahkan daripada menggabungkannya. Tetapi jika Anda menginginkan lebih banyak solusi, bacalah utas lainnya juga!
whuber
2
OK, terima kasih. Saya baru saja menemukan situs web ini kemarin dan saya masih mengenalnya. Saya akan mencoba melakukannya dengan posting / pertanyaan saya di masa depan. Saya menyukai situs ini jauh lebih baik daripada forum ArcGIS.
Kimball
Saya tidak bermaksud komentar itu sebagai kritik dengan cara apa pun, Kimball: itu ada di sana untuk mencegah penggabungan dua utas, itu saja. Selamat datang di komunitas kami! (Dan tolong beri tahu teman Anda tentang kami, terutama yang ada di forum ArcGIS. :-)
whuber
Kanan. Saya tahu Anda tidak bermaksud seperti itu. Saya sangat menikmati komunitas ini dan sudah mulai memberi tahu orang lain tentang forum baru ini.
Kimball
Terima kasih atas bagian penting Anda. Saya bertanya-tanya bagaimana saya bisa menggunakan satu set data bidang dalam fitur titik untuk membuat buffer persegi panjang menggunakan skrip yang Anda berikan tanpa secara manual mengetikkan koordinatnya. Terima kasih

Jawaban:

47

Coba langkah-langkah ini dengan ArcMap 10:

  1. Buffer fitur titik Anda (ArcToolbox> Alat Analisis> Kedekatan> Buffer). Pastikan untuk memilih jarak yang benar di kotak Unit linear.
  2. Masukkan buffer yang baru Anda buat ke dalam fitur Amplop ke Poligon (Alat Manajemen Data> Fitur> Amplop Fitur ke Poligon). Pastikan untuk memilih kotak "Buat fitur multi bagian" jika Anda memiliki beberapa poin.

Untuk solusi Python:

Menggunakan SearchCursor dan InsertCursor untuk membuat buffer persegi

masukkan deskripsi gambar di sini

Harun
sumber
2
+1 Balasan yang menunjukkan solusi berfungsi adalah yang terbaik.
whuber
12

Solusi yang mungkin adalah membuat buffer bundar "normal" Anda menggunakan alat buffer ESRI standar dengan radius apa pun yang Anda inginkan dan kemudian melakukan Feature Envelope To Polygon pada kelas fitur buffer yang dihasilkan. Ini menciptakan fitur amplop persegi di sekitar setiap fitur. Fitur Amplop ke Polygon berada di dalam Manajemen Data> Fitur. Model pembangun model akan terlihat mirip dengan:

masukkan deskripsi gambar di sini

Tinggi
sumber
Solusi yang sangat baik! Juga, dengan membuat output buffer sebagai lapisan in_memory (in_memory \ tmpBuffer) dan Anda dapat menghindari penulisan data yang tidak dibutuhkan ke disk, dan membuat proses lebih cepat.
RyanDalton
9

Karena skrip yang ditautkan pada akhir kode Aaron hanya dapat digunakan untuk buffer persegi dan tidak menggunakan modul arcpy.da yang lebih baru, saya telah menulis sebuah skrip yang dapat digunakan untuk membuat buffer persegi panjang. Pada dataset titik acak 10k, selesai dalam 10 detik:

masukkan deskripsi gambar di sini

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)
Paul
sumber
5

Dengan asumsi Anda menggunakan ArcObjects (harap gunakan tag untuk menentukan bahasa dan API yang Anda gunakan), Anda dapat menggunakan IEnvelope.Expanduntuk membuat buffer persegi dari amplop poin, seperti dalam contoh ini: Dapatkan Semua Fitur dari Pencarian Point di GeoFeatureLayer Snippet

ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope;
envelope.Expand(searchTolerance, searchTolerance, false);
blah238
sumber
1

Sebagai alternatif jawaban Aaron, bagi mereka yang tidak memiliki lisensi Tingkat Lanjut, gunakan alat Geometri Batas Minimum . Langkah-langkah di bawah ini (dimodifikasi dari Aaron):

  1. Buffer fitur titik Anda (ArcToolbox> Alat Analisis> Kedekatan> Buffer). Pastikan untuk memilih jarak yang benar di kotak Unit linear.
  2. Masukkan buffer yang baru Anda buat ke dalam alat Geometri Batas Minimum (Alat Manajemen Data> Fitur> Geometri Batas Minimum). Gunakan 'RECTANGLE_BY_AREA' atau 'RECTANGLE_BY_WIDTH', opsi lain hanya tersedia dengan lisensi Advanced.

EDIT : Opsi ini tidak memungkinkan Anda mengontrol orientasi buffer persegi yang dihasilkan, tanpa menggunakan opsi 'ENVELOPE' (yang memerlukan lisensi Tingkat Lanjut). Dengan mencentang opsi 'Tambahkan karakteristik geometri sebagai atribut ke keluaran (opsional)' - offset yang dihasilkan akan dicatat sebagai 'MBG_Orientation' di kelas fitur keluaran. Ini kemudian dapat digunakan untuk memutar fitur kembali ke tengah jika diinginkan - lihat Memutar poligon berdasarkan nilai dari tabel atribut menggunakan ArcPy? untuk solusi potensial untuk itu.

masukkan deskripsi gambar di sini

Dùn Caan
sumber
Untuk kelas fitur khusus saya itu akhirnya memutar kotak di berbagai arah menggunakan alur kerja ini. Mungkin karena saya memiliki lingkaran penyangga yang tumpang tindih. Tidak yakin. Saya meminta Esri menggunakan metode Aaron di atas pada kelas fitur yang sama dan tidak memutar lingkaran yang disangga.
Andrew
@Andrew, ya Anda benar, itu adalah batasan alat tanpa Lisensi Lanjut. Menggunakan opsi ENVELOPE akan mengembalikan hasil yang sama dengan metode Aaron di atas, tetapi juga membutuhkan Lisensi Lanjutan. Solusi yang potensial adalah mencentang opsi 'tambahkan karakteristik geometri sebagai atribut', cari tahu jumlah kemiringannya (harus konsisten), kemudian putar buffer persegi yang dihasilkan dengan jumlah tersebut dalam sesi pengeditan. Belum mencoba ini.
Dùn Caan
0

Situs ini menjelaskan cara mengkonversi csv ke kotak atau persegi panjang atau buffer lingkaran menggunakan JavaScript geographiclib dan js2shapefile.

Anda dapat melihat apakah itu memecahkan masalah Anda.

GeoSpatialEarth.in
sumber