การสร้างบัฟเฟอร์สี่เหลี่ยมรอบคุณสมบัติจุดโดยใช้ ArcGIS สำหรับเดสก์ท็อป?


31

ฉันต้องการสร้างบัฟเฟอร์สี่เหลี่ยมจากคุณสมบัติจุด แต่ฉันไม่เข้าใจรหัสที่เข้าสู่มัน

มีการถามคำถามที่คล้ายกันในเว็บไซต์ forums.esri แต่เมื่อ 10 กว่าปีที่แล้วและมันไม่ทำงานเมื่อฉันลองใช้รหัส

ฉันจะสร้างบัฟเฟอร์สี่เหลี่ยมจากคุณลักษณะจุดได้อย่างไร


gis.stackexchange.com/questions/12479/…เป็นข้อมูลที่ซ้ำกัน (เพราะเป็นคำตอบทั่วไปของคำถามนี้) แต่เนื่องจากมีคำตอบที่ดีอยู่แล้วที่นี่ซึ่งเฉพาะเจาะจงกับบัฟเฟอร์สี่เหลี่ยมดูเหมือนว่าจะเปิดทั้งสองเธรดและ แยกจากกันแทนที่จะรวมเข้าด้วยกัน แต่ถ้าคุณต้องการวิธีแก้ปัญหาเพิ่มเติมอ่านกระทู้อื่นด้วย!
whuber

2
ตกลงขอบคุณมาก ฉันเพิ่งพบเว็บไซต์นี้เมื่อวานนี้และฉันยังคงคุ้นเคยกับมัน ฉันจะพยายามทำสิ่งนั้นกับโพสต์ / คำถามในอนาคตของฉัน ฉันชอบเว็บไซต์นี้ดีกว่าฟอรัม ArcGIS
Kimball

ฉันไม่ได้หมายความว่าความคิดเห็นนั้นเป็นการวิจารณ์ในทางใดทางหนึ่งคิมบอลล์: มันอยู่ที่นั่นเพื่อป้องกันการรวมสองหัวข้อนั่นคือทั้งหมด ยินดีต้อนรับสู่ชุมชนของเรา! (และโปรดบอกเพื่อนของคุณเกี่ยวกับเราโดยเฉพาะผู้ที่อยู่ในฟอรัม ArcGIS :-)
whuber

ขวา. ฉันรู้ว่าคุณไม่ได้หมายความอย่างนั้น ฉันสนุกกับชุมชนนี้มากและได้เริ่มบอกคนอื่นเกี่ยวกับฟอรัมใหม่นี้แล้ว
Kimball

ขอบคุณสำหรับการแบ่งปันที่สำคัญของคุณ ฉันสงสัยว่าฉันจะใช้ชุดข้อมูลฟิลด์ในคุณลักษณะจุดเพื่อสร้างบัฟเฟอร์สี่เหลี่ยมผืนผ้าโดยใช้สคริปต์ที่คุณให้ไว้ได้อย่างไรโดยไม่ต้องพิมพ์พิกัดด้วยตนเอง ขอบคุณ

คำตอบ:


47

ลองขั้นตอนเหล่านี้ด้วย ArcMap 10:

  1. บัฟเฟอร์คุณสมบัติจุดของคุณ (ArcToolbox> เครื่องมือวิเคราะห์> ความใกล้ชิด> บัฟเฟอร์) ตรวจสอบให้แน่ใจว่าได้เลือกระยะห่างที่ถูกต้องในกล่อง Linear Unit
  2. ป้อนบัฟเฟอร์ที่สร้างขึ้นใหม่ของคุณลงในคุณสมบัติซองจดหมายไปยังเครื่องมือรูปหลายเหลี่ยม (เครื่องมือการจัดการข้อมูล> คุณลักษณะ> ซองจดหมายคุณสมบัติไปยังรูปหลายเหลี่ยม) ตรวจสอบให้แน่ใจว่าได้เลือกช่อง "สร้างคุณลักษณะหลายส่วน" หากคุณมีหลายจุด

สำหรับโซลูชัน Python:

ใช้ SearchCursor และ InsertCursor เพื่อสร้างบัฟเฟอร์สี่เหลี่ยม

ป้อนคำอธิบายรูปภาพที่นี่


2
+1 คำตอบที่แสดงให้เห็นถึงวิธีการทำงานที่ดีที่สุด
whuber

12

วิธีแก้ปัญหาที่เป็นไปได้คือการสร้างบัฟเฟอร์กลม "ปกติ" ของคุณโดยใช้เครื่องมือบัฟเฟอร์ ESRI มาตรฐานที่มีรัศมีอะไรก็ตามที่คุณต้องการ สิ่งนี้จะสร้างคุณสมบัติซองจดหมายรูปสี่เหลี่ยมล้อมรอบขอบเขตของแต่ละคุณสมบัติ คุณสมบัติซองจดหมายไปยังรูปหลายเหลี่ยมตั้งอยู่ภายในการจัดการข้อมูล> คุณสมบัติ โมเดลตัวสร้างโมเดลจะมีลักษณะคล้ายกับ:

ป้อนคำอธิบายรูปภาพที่นี่


ทางออกที่ดีเยี่ยม! นอกจากนี้โดยการสร้างเอาต์พุตของบัฟเฟอร์เป็นเลเยอร์ in_memory (in_memory \ tmpBuffer) และคุณสามารถหลีกเลี่ยงการเขียนข้อมูลที่ไม่จำเป็นลงในดิสก์และทำให้กระบวนการเร็วขึ้นมาก
RyanDalton

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)

5

สมมติว่าคุณใช้ ArcObjects (โปรดใช้แท็กเพื่อระบุภาษาและ API ที่คุณใช้) คุณสามารถใช้IEnvelope.Expandสร้างบัฟเฟอร์สี่เหลี่ยมจากซองจดหมายของจุดได้ดังตัวอย่างนี้: รับคุณลักษณะทั้งหมดจากการค้นหาจุดใน GeoFeatureLayer Snippet

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

1

เพื่อเป็นทางเลือกแทนคำตอบของ Aaron สำหรับผู้ที่ไม่มีใบอนุญาตขั้นสูงให้ใช้เครื่องมือเรขาคณิตขั้นต่ำที่ จำกัด ขั้นตอนด้านล่าง (แก้ไขจากแอรอน):

  1. บัฟเฟอร์คุณสมบัติจุดของคุณ (ArcToolbox> เครื่องมือวิเคราะห์> ความใกล้ชิด> บัฟเฟอร์) ตรวจสอบให้แน่ใจว่าได้เลือกระยะห่างที่ถูกต้องในกล่อง Linear Unit
  2. ป้อนบัฟเฟอร์ที่สร้างขึ้นใหม่ของคุณลงในเครื่องมือเรขาคณิตการ จำกัดขั้นต่ำ (เครื่องมือการจัดการข้อมูล> คุณลักษณะ> เรขาคณิตการ จำกัด ขั้นต่ำ) ใช้ 'RECTANGLE_BY_AREA' หรือ 'RECTANGLE_BY_WIDTH' ตัวเลือกอื่นจะใช้ได้เฉพาะกับใบอนุญาตขั้นสูง

แก้ไข : ตัวเลือกนี้ไม่อนุญาตให้คุณควบคุมการวางแนวของบัฟเฟอร์สี่เหลี่ยมที่เกิดขึ้นโดยไม่ใช้ตัวเลือก 'ENVELOPE' (ซึ่งต้องมีใบอนุญาตขั้นสูง) โดยการทำเครื่องหมายที่ตัวเลือก 'เพิ่มลักษณะทางเรขาคณิตเป็นแอตทริบิวต์ไปยังเอาต์พุต (ตัวเลือก)' - ออฟเซ็ตผลลัพธ์จะถูกบันทึกเป็น 'MBG_Orientation' ในคลาสคุณลักษณะเอาท์พุท สิ่งนี้สามารถใช้เพื่อหมุนคุณสมบัติกลับไปที่ตำแหน่งกึ่งกลางหากต้องการ - ดูการหมุนรูปหลายเหลี่ยมตามค่าจากตารางแอตทริบิวต์โดยใช้ ArcPy? สำหรับทางออกที่เป็นไปได้

ป้อนคำอธิบายรูปภาพที่นี่


สำหรับคลาสฟีเจอร์เฉพาะของฉันมันเป็นการหมุนสแควร์สไปในทิศทางต่างๆโดยใช้เวิร์กโฟลว์นี้ อาจเป็นเพราะฉันมีวงกลมบัฟเฟอร์ที่ทับซ้อนกัน ไม่แน่ใจ. ฉันมี Esri ใช้วิธีของแอรอนด้านบนในฟีเจอร์คลาสเดียวกันและมันไม่หมุนวงกลมบัฟเฟอร์
แอนดรูว์

@ แอนดรูว์ใช่แล้วคุณพูดถูกนั่นเป็นข้อ จำกัด ของเครื่องมือโดยไม่มีใบอนุญาตขั้นสูง การใช้ตัวเลือก ENVELOPE จะให้ผลลัพธ์เช่นเดียวกับวิธีการของ Aaron ด้านบน แต่ยังต้องมีใบอนุญาตขั้นสูง วิธีแก้ปัญหาที่เป็นไปได้คือทำเครื่องหมายที่ตัวเลือก 'เพิ่มลักษณะเรขาคณิตเป็นแอตทริบิวต์' ค้นหาจำนวนที่เอียง (ควรสอดคล้องกัน) จากนั้นหมุนบัฟเฟอร์สี่เหลี่ยมที่เกิดขึ้นตามจำนวนนั้นในเซสชันการแก้ไข ยังไม่ได้ลองเลย
D Can Caan

0

ไซต์นี้อธิบายวิธีการแปลง csv เป็น square หรือสี่เหลี่ยมผืนผ้าหรือ buffer วงกลมโดยใช้ทางภูมิศาสตร์ JavaScript และ js2shapefile

คุณสามารถดูว่ามันจะช่วยแก้ปัญหาของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.