एक पॉलीलाइन के सभी बिंदुओं को प्राप्त करें


11

मेरे पास अजगर में कुछ पॉलीलाइन फीचर ऑब्जेक्ट हैं। अब मैं पॉलीनेस के सभी बिंदुओं को प्राप्त करना चाहता हूं।

उदाहरण के लिए, यदि एक पॉलीलाइन बिंदु [0,0]अंत बिंदु शुरू कर दिया है [5,5]। परिणाम: [1,1];[2,2];[3,3];[4,4];[5,5]

मैं अंत बिंदु सहित उस रेखा पर सभी पूर्णांक बिंदुओं को खोजना चाहता हूं। सीधी रेखा के लिए यह मृत सरल है, लेकिन अगर पॉलीलाइन में बीज़र कर्व, सर्कुलर आर्क, एलिप्टिक आर्क ज्यामिति प्रकार हैं, तो मैं यह कैसे कर सकता हूं?

संपादित करें:

मैं केवल उन उपकरणों का उपयोग कर सकता हूं जो आर्कजीआईएस के सभी लाइसेंस स्तरों में उपलब्ध हैं। उदाहरण के लिए, आर्कजीआईएस बेसिक।


2
सामान्य तौर पर आपको अक्सर अच्छे 'पूर्णांक' अंक नहीं मिलेंगे। यह आपके उदाहरण में काम करता है, लेकिन वास्तविक जीवन में अक्सर नहीं। आमतौर पर, आपको केवल कोने के लिए स्थान मिलते हैं, इसलिए आपके मामले में आपको [0,0] और [5,5] मिलेंगे। 'मध्यवर्ती' बिंदुओं को 'ग्रहण' किया जा सकता है। यह सुनिश्चित नहीं है कि अजगर में ऐसा कैसे किया जाए, लेकिन कई उपकरण आपको एक पंक्ति से कोने की एक बिंदु फ़ाइल बनाने की अनुमति देंगे।
डैरेन कोप

जवाबों:


18

मैं जानता हूँ कि यह पुराना है लेकिन जैसा कि मैंने के लिए ArcInfo की जरूरत नहीं है मैं एक ही लिए देख रहा था FeatureVerticesToPoints उपकरण। ऊपर दिए गए खोज कर्सर समाधान का उपयोग करने के बाद मैं कोड को सरल बनाने के लिए आगे बढ़ा और पाया कि डेटा एक्सेस मॉड्यूल में NumPy Arrays का उपयोग करके एक सरल और बहुत ही त्वरित स्क्रिप्ट का उत्पादन किया जा सकता है। मैं इसे एक स्क्रिप्ट टूल के रूप में उपयोग कर रहा हूं।

नोट: कुंजी में explode_to_pointsपैरामीटर हैarcpy.da.FeatureClassToNumPyArray

यहां आर्कजीस रिपॉजिटरी स्थान: फ़ीचर क्लास टू पॉइंट्स से लिंक है

# 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 पॉल :) +1 में आपका स्वागत है । धन्यवाद! कुछ संपादन युक्तियाँ: पाठ, इनलाइन या एक ब्लॉक का चयन करें, और फिर ctrl-kकोड स्वरूपण लागू करने के लिए ( bपुराने और iकहानियों के लिए समान )। कन्वेंशन से हम "हाय", "थैंक्स", "चीयर्स" जैसे चट्टी चिटों से बचते हैं। उन्हें हमेशा मौजूद होने के रूप में निहित किया जाता है, और यह विचार सुदृढ़ करने में मदद करता है कि यह स्थान सामान्य मंचों और ईमेल से अलग है। विमान में आपका स्वागत है।
मैट विल्की

आपको कोड सरणी = arcpy.da.FeatureClassToNumPyArray (InFc, ["SHAPE @ XY"], "", spatial_reference = SR, explode_to_points = True) की इस लाइन पर जहां_ के लिए प्लेसहोल्डर लगाने की आवश्यकता है
ट्रिस्टन फॉरवर्ड

4

जैसा कि मैंने समझा कि आपको अपने पॉलीलाइन फीचर्स के लिए वर्टिकल की संख्या बढ़ाने की आवश्यकता है। और सभी "बीज़र कर्व, सर्कुलर आर्क, एलिप्टिक आर्क" सेगमेंट को कई लाइन सेगमेंट में बदलना है।

ArcGIS में इस कार्य के लिए आप ArcToolbox में Densify (संपादन) उपकरण का उपयोग कर सकते हैं ।

तब आप अपने पॉलीइन्स के कोने को बिंदु सुविधाओं में परिवर्तित कर सकते हैं जैसा कि सुझाए गए डैरेन कोप और कलाकृति 21 में हैं।

यदि आप इसे करना पसंद करते हैं तो आर्कपैक एक लाइन हेल्प टॉपिक के साथ नए पॉइंट्स बनाना चाहते हैं।


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 जोड़े की नेस्टेड सूची:

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
@ क्रूसिफ़सौल - हां, यह उस ईएसआरआई नमूने का एक भिन्नता है , लेकिन यह सभी बिंदुओं के एक्स, वाई जोड़े को देता है, न कि केवल अंतिम बिंदु। यही आप चाहते हैं, सही है?
चाड कूपर

मुझे नहीं मिला। केवल एक चीज बदल रही है print pnt.X, pnt.Yजिसके साथ आप बदल रहे हैं part_list.append([pnt.X, pnt.Y])। और आप इसे लूप के अंत में प्रिंट कर रहे हैं। आपका कोड एक पंक्ति के सभी बिंदुओं को कैसे प्राप्त कर सकता है लेकिन ESRIs कोड नहीं करता है?
उपयोगकर्ता

वर्णन विधि मेरे लिए काम नहीं करती थी। मुझे केवल अपना आकार फ़ील्ड निर्दिष्ट करना था - arcpy.da.SearchCursor (fc, ["SHAPE @"])
jbalk

1

जैसा कि डैरेन कोप ने सुझाव दिया है, अपनी परत को एक बिंदु कोने में परिवर्तित करना फीचर वर्टिक्स टू पॉइंट टूल का उपयोग करके किया जा सकता है ।

यहाँ अजगर कोड छीन लिया गया है:

# 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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.