รับคะแนนทั้งหมดของ polyline


11

ฉันมีออบเจกต์คุณลักษณะ polyline ในหลาม ตอนนี้ฉันต้องการที่จะได้รับคะแนนทั้งหมดของ polylines

ตัวอย่างเช่นถ้ามีเส้นมีจุดเริ่มต้นจุดสิ้นสุด[0,0] ส่งผลให้เกิด:[5,5][1,1];[2,2];[3,3];[4,4];[5,5]

ฉันต้องการหาจำนวนเต็มทั้งหมดในบรรทัดนั้นรวมถึงจุดสิ้นสุด สำหรับเส้นตรงนี่เป็นเรื่องง่าย แต่ถ้า polyline มี Beizer Curve, Circular Arc, ประเภท Elliptic Arc เรขาคณิตฉันจะทำอย่างไร

แก้ไข:

ฉันสามารถใช้เครื่องมือเหล่านั้นที่มีอยู่ในทุกระดับสิทธิ์การใช้งานของ ArcGIS เท่านั้น ตัวอย่างเช่น ArcGIS Basic


2
โดยทั่วไปคุณจะไม่ได้คะแนน 'จำนวนเต็ม' ที่ดี มันทำงานในตัวอย่างของคุณ แต่ไม่บ่อยครั้งในชีวิตจริง โดยปกติคุณจะได้รับตำแหน่งสำหรับจุดยอดดังนั้นในกรณีของคุณคุณจะได้ [0,0] และ [5,5] คะแนน 'ขั้นกลาง' สามารถ 'สันนิษฐาน' ไม่แน่ใจว่าจะทำสิ่งนี้อย่างไรในงูหลาม แต่เครื่องมือหลายอย่างจะช่วยให้คุณสร้างไฟล์จุดของจุดยอดจากบรรทัด
Darren Cope

คำตอบ:


18

ฉันรู้ว่านี่เก่า แต่ฉันกำลังมองหาสิ่งเดียวกันกับที่ฉันไม่มี ArcInfo สำหรับเครื่องมือFeatureVerticesToPoints หลังจากใช้โซลูชันเคอร์เซอร์ค้นหาด้านบนฉันไปข้างหน้าเพื่อทำให้รหัสง่ายขึ้นและพบว่าการใช้ NumPy Arrays ใน Data Access Module สามารถสร้างสคริปต์ที่ง่ายและรวดเร็วมาก ฉันใช้สิ่งนี้เป็นเครื่องมือสคริปต์

หมายเหตุ: คีย์คือexplode_to_pointsพารามิเตอร์ในarcpy.da.FeatureClassToNumPyArray

นี่คือลิงค์ไปยังที่ตั้งของคลังเก็บ ArcGIS: Feature Feature to Points

# Feature Class to Points
# 
# Paul Smith (2012) paul@neoncs.com.au

# Imports
import arcpy
import numpy

#Inputs from user parameters
InFc  = arcpy.GetParameterAsText(0) # input feature class
OutFc = arcpy.GetParameterAsText(1) # output feature class

# Spatial reference of input feature class
SR = arcpy.Describe(InFc).spatialReference

# Create NumPy array from input feature class
array = arcpy.da.FeatureClassToNumPyArray(InFc,["SHAPE@XY"], spatial_reference=SR, explode_to_points=True)

# Check array and Exit if no features found
if array.size == 0:
    arcpy.AddError(InFc + " has no features.")

# Create a new points feature class
else:
    arcpy.da.NumPyArrayToFeatureClass(array, OutFc, ['SHAPE@XY'], SR)

ยินดีต้อนรับสู่ GIS.se Paul :) +1 สำหรับการปัดเศษที่ดีและดีกว่าการสนับสนุนครั้งแรกโดยเฉลี่ยพร้อมโค้ดในการบูต ขอบคุณ! เคล็ดลับการแก้ไขบางประการ: เลือกข้อความแบบอินไลน์หรือบล็อกจากนั้นctrl-kใช้การจัดรูปแบบรหัส (เหมือนกันกับแบบbเก่าและแบบiTalic) ตามแบบแผนเรามักจะหลีกเลี่ยงบิตช่างพูดเช่น "สวัสดี", "ขอบคุณ", "ไชโย" สิ่งเหล่านี้บอกเป็นนัยว่ามีอยู่เสมอและช่วยเสริมความคิดให้กับสถานที่นี้แตกต่างจากฟอรัมและอีเมลปกติ ยินดีต้อนรับสู่ต่างประเทศ
matt wilkie

คุณต้องใส่ตัวยึดตำแหน่งสำหรับ where_clause บนบรรทัดนี้ของโค้ดแถว = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", spatial_reference = SR, explode_to_points = True)
Tristan Forward

4

ดังที่ฉันเข้าใจแล้วคุณจำเป็นต้องเพิ่มจำนวนจุดยอดสำหรับฟีเจอร์ polyline ของคุณ และยังแปลงกลุ่ม "Beizer Curve, Circular Arc, Elliptic Arc" ทั้งหมดให้เป็นเซ็กเมนต์บรรทัดหลาย ๆ

สำหรับภารกิจนี้ใน ArcGIS คุณสามารถใช้เครื่องมือ Densify (Editing)ใน ArcToolbox

จากนั้นคุณสามารถแปลงจุดยอด polylines ของคุณเพื่อชี้คุณสมบัติตามที่แนะนำ Darren Cope และ Artwork21

หากคุณต้องการทำใน ArcMap ลองดูที่การสร้างคะแนนใหม่ตามหัวข้อวิธีใช้บรรทัด


3

ข้อมูลต่อไปนี้ควรใช้กับโพลีนและรูปหลายเหลี่ยม:

import arcpy

infc = r"D:\Projects\GDBs\slowbutter.gdb\fc"

desc = arcpy.Describe(infc)
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor(infc)
for row in rows:
    # Create the geometry object
    feat = row.getValue(shapefieldname)
    print "Feature %i: " % row.getValue(desc.OIDFieldName)
    partnum = 0
    # Step through each part of the feature
    for part in feat:
        print "Part %i: " % partnum
        part_list = []
        for pnt in feat.getPart(partnum):
            if pnt:
                # Add to list
                part_list.append([pnt.X, pnt.Y])
            else:
                # If pnt is None, this represents an interior ring
                print "Interior Ring:"
        partnum += 1  
        print part_list

สำหรับข้อมูลถนนในสหราชอาณาจักรฉันได้รับสิ่งนี้ รายการที่ซ้อนกันของ X, Y เป็นคู่สำหรับแต่ละจุดสุดยอดที่ประกอบเป็น polyline:

Feature 7: 
Part 0: 
[[-0.48053999999996222, 51.482510000000048], [-0.48032999999992398, 
51.482609000000082], [-0.48026999999996178, 51.48273800000004], 
[-0.48043999999993048, 51.482891000000052], [-0.48065999999994347, 51.482948000000079],
[-0.48123999999995704, 51.483009000000038]]

ฉันเคยเห็นสิ่งนี้ในหน้า ESRI แต่ถ้าคุณดูอย่างละเอียดในคำอธิบายรหัสนี้จะส่งคืนเฉพาะจุดสิ้นสุดไม่ใช่คะแนนระหว่างพวกเขา
ผู้ใช้

2
@ crucifiedsoul - ใช่นี่คือการเปลี่ยนแปลงของตัวอย่าง ESRIแต่ให้ X, Y คู่ของคะแนนทั้งหมดไม่ใช่แค่จุดสิ้นสุด นั่นคือสิ่งที่คุณต้องการถูกต้อง?
Chad Cooper

ฉันไม่เข้าใจ สิ่งเดียวที่มีการเปลี่ยนแปลงคุณจะเปลี่ยนด้วยprint pnt.X, pnt.Y part_list.append([pnt.X, pnt.Y])และคุณกำลังพิมพ์สิ่งนี้ในตอนท้ายของลูป รหัสของคุณจะได้รับคะแนนทั้งหมดในบรรทัดได้อย่างไร แต่รหัส ESRIs ไม่ได้
ผู้ใช้

วิธีการอธิบายใช้ไม่ได้สำหรับฉัน ฉันต้องระบุฟิลด์รูปร่างของฉัน - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk

1

ตามที่ Darren Cope ได้แนะนำการแปลงเลเยอร์ของคุณเป็นจุดยอดอาจทำได้โดยใช้เครื่องมือจุดยอดคุณลักษณะเป็นจุด

นี่คือรหัสหลาม snippedt:

# import system modules 
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inFeatures = "majorrds.shp"
outFeatureClass = "c:/output/output.gdb/majorrds_midpt"

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