ฉันต้องการสร้างบัฟเฟอร์สี่เหลี่ยมจากคุณสมบัติจุด แต่ฉันไม่เข้าใจรหัสที่เข้าสู่มัน
มีการถามคำถามที่คล้ายกันในเว็บไซต์ forums.esri แต่เมื่อ 10 กว่าปีที่แล้วและมันไม่ทำงานเมื่อฉันลองใช้รหัส
ฉันจะสร้างบัฟเฟอร์สี่เหลี่ยมจากคุณลักษณะจุดได้อย่างไร
ฉันต้องการสร้างบัฟเฟอร์สี่เหลี่ยมจากคุณสมบัติจุด แต่ฉันไม่เข้าใจรหัสที่เข้าสู่มัน
มีการถามคำถามที่คล้ายกันในเว็บไซต์ forums.esri แต่เมื่อ 10 กว่าปีที่แล้วและมันไม่ทำงานเมื่อฉันลองใช้รหัส
ฉันจะสร้างบัฟเฟอร์สี่เหลี่ยมจากคุณลักษณะจุดได้อย่างไร
คำตอบ:
ลองขั้นตอนเหล่านี้ด้วย ArcMap 10:
สำหรับโซลูชัน Python:
ใช้ SearchCursor และ InsertCursor เพื่อสร้างบัฟเฟอร์สี่เหลี่ยม
วิธีแก้ปัญหาที่เป็นไปได้คือการสร้างบัฟเฟอร์กลม "ปกติ" ของคุณโดยใช้เครื่องมือบัฟเฟอร์ ESRI มาตรฐานที่มีรัศมีอะไรก็ตามที่คุณต้องการ สิ่งนี้จะสร้างคุณสมบัติซองจดหมายรูปสี่เหลี่ยมล้อมรอบขอบเขตของแต่ละคุณสมบัติ คุณสมบัติซองจดหมายไปยังรูปหลายเหลี่ยมตั้งอยู่ภายในการจัดการข้อมูล> คุณสมบัติ โมเดลตัวสร้างโมเดลจะมีลักษณะคล้ายกับ:
เนื่องจากสคริปต์ที่ลิงก์ในตอนท้ายของรหัสของ 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)
สมมติว่าคุณใช้ ArcObjects (โปรดใช้แท็กเพื่อระบุภาษาและ API ที่คุณใช้) คุณสามารถใช้IEnvelope.Expand
สร้างบัฟเฟอร์สี่เหลี่ยมจากซองจดหมายของจุดได้ดังตัวอย่างนี้: รับคุณลักษณะทั้งหมดจากการค้นหาจุดใน GeoFeatureLayer Snippet
ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope;
envelope.Expand(searchTolerance, searchTolerance, false);
เพื่อเป็นทางเลือกแทนคำตอบของ Aaron สำหรับผู้ที่ไม่มีใบอนุญาตขั้นสูงให้ใช้เครื่องมือเรขาคณิตขั้นต่ำที่ จำกัด ขั้นตอนด้านล่าง (แก้ไขจากแอรอน):
แก้ไข : ตัวเลือกนี้ไม่อนุญาตให้คุณควบคุมการวางแนวของบัฟเฟอร์สี่เหลี่ยมที่เกิดขึ้นโดยไม่ใช้ตัวเลือก 'ENVELOPE' (ซึ่งต้องมีใบอนุญาตขั้นสูง) โดยการทำเครื่องหมายที่ตัวเลือก 'เพิ่มลักษณะทางเรขาคณิตเป็นแอตทริบิวต์ไปยังเอาต์พุต (ตัวเลือก)' - ออฟเซ็ตผลลัพธ์จะถูกบันทึกเป็น 'MBG_Orientation' ในคลาสคุณลักษณะเอาท์พุท สิ่งนี้สามารถใช้เพื่อหมุนคุณสมบัติกลับไปที่ตำแหน่งกึ่งกลางหากต้องการ - ดูการหมุนรูปหลายเหลี่ยมตามค่าจากตารางแอตทริบิวต์โดยใช้ ArcPy? สำหรับทางออกที่เป็นไปได้
ไซต์นี้อธิบายวิธีการแปลง csv เป็น square หรือสี่เหลี่ยมผืนผ้าหรือ buffer วงกลมโดยใช้ทางภูมิศาสตร์ JavaScript และ js2shapefile
คุณสามารถดูว่ามันจะช่วยแก้ปัญหาของคุณ