अंक जोड़ी से लाइनें बनाते हुए आर्कपी के साथ समन्वय होता है?


11

मुझे कुछ बिंदु जोड़ी निर्देशांक (आरंभ और अंत अंक) मिले हैं, जिन्हें मुझे लाइनों में बदलना है। अब तक, मैंने प्रत्येक निर्देशांक के एक में pippo.Point(), pippo.CalculateGeometry()प्रत्येक piont की ज्यामिति को परिभाषित pippo.append(defined geometry)करने के लिए, और बिंदुओं की जोड़ी को पहचानने के लिए, और फिर अपनी लाइन प्राप्त करने के लिए PointsToLine का उपयोग किया। यह सैकड़ों लाइनों के लिए करने के लिए काफी समय महंगा है।

क्या ऐसा करने का कोई छोटा तरीका है?

उदाहरण के लिए, एक ही तालिका के विभिन्न क्षेत्रों में प्रत्येक पंक्ति के शुरू और अंत बिंदु को रखें और अंक ज्यामिति के लिए पारित किए बिना सीधे लाइनों को आयात करें।

जवाबों:


8

यह एक तालिका पढ़ता है (इस मामले में एक्सेल शीट, लेकिन कोई तालिका प्रकार हो सकता है) जो ऐसा दिखता है:

यहाँ छवि विवरण दर्ज करें

S_X X बिंदु, E_X अंत X बिंदु, Y के लिए समान है। हम इनपुट तालिका के माध्यम से पुनरावृत्ति करते हैं, फिर प्रत्येक पंक्ति के लिए, प्रारंभ / समाप्ति X / Ys को एक बिंदु में सेट करते हैं, उस बिंदु को एक सरणी में जोड़ते हैं, फिर दो बिंदुओं के सरणी से एक पॉलीलाइन बनाते हैं। फिर फीचरक्लास में डालें। धोये और दोहराएं।

import arcpy

in_rows = arcpy.SearchCursor(r"D:\Temp\Lines.xls\Sheet1$")

point = arcpy.Point()
array = arcpy.Array()

featureList = []
cursor = arcpy.InsertCursor(r"D:\Temp\Lines.shp")
feat = cursor.newRow()

for in_row in in_rows:
    # Set X and Y for start and end points
    point.X = in_row.S_X
    point.Y = in_row.S_Y
    array.add(point)
    point.X = in_row.E_X
    point.Y = in_row.E_Y
    array.add(point)   
    # Create a Polyline object based on the array of points
    polyline = arcpy.Polyline(array)
    # Clear the array for future use
    array.removeAll()
    # Append to the list of Polyline objects
    featureList.append(polyline)
    # Insert the feature
    feat.shape = polyline
    cursor.insertRow(feat)
del feat
del cursor

और आपको अपनी लाइनें मिलेंगी:

यहाँ छवि विवरण दर्ज करें


धन्यवाद, मैं कोशिश करूँगा और मेरे विश्लेषण की अवधि का अनुमान लगाता हूँ .. यह वही था जो मैं करने की कोशिश कर रहा था :-)
Annalisa Minelli

लाइन बिंदु। X = in_row.S_X के लिए यह कहते हुए एक त्रुटि देता है कि इनपुट मान संख्यात्मक नहीं है। मैंने इसे इंट या फ्लोट या न्यूमेरिक बनाने की कोशिश की, लेकिन नॉट वर्क क्योंकि फील्ड नं। नॉनटेप है। कोई मदद?
फेडेरिको गोमेज़

5

मैंने पिछले हफ्ते एक पायथन स्क्रिप्ट बनाई (हालांकि आर्कपी का उपयोग नहीं कर रहा हूं), जो कि एक अनुक्रमिक संख्या क्षेत्र ("एसईक्यू") के अनुसार बस लाइनों (एक बिंदु एसपीपी) की ज्यामिति बना रहे हैं। आप आसानी से इसे एक ही फ़ीचर के क्षेत्र से समन्वय करने के लिए ट्विक कर सकते हैं (ज्यामिति के बजाय फ़ील्ड मान का उपयोग करके)।

# -*- coding: utf-8 -*-
###############################################################################
from sys import argv
import osgeo.ogr
import os, os.path
###############################################################################

script, srcSHP = argv

#-- Open source shapefile
shapefile = osgeo.ogr.Open(srcSHP)
layer = shapefile.GetLayer(0)
spatialRef = layer.GetSpatialRef()

#-- Output directory
outDir = os.path.dirname(srcSHP)
outDirName = os.path.basename(outDir)

driver = osgeo.ogr.GetDriverByName("ESRI Shapefile")
outFile = driver.CreateDataSource(os.path.join(outDir,outDirName + "_lines.shp"))
outLayer = outFile.CreateLayer("layer", spatialRef)

#-- Adding fields to the output shapefile
fieldDef = osgeo.ogr.FieldDefn("line_no", osgeo.ogr.OFTString)
fieldDef.SetWidth(12)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("From_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("To_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

#-- Going through each feature, one by one
#-- The last point is the end of the line so I don't want to iterate through that one
for i in range(layer.GetFeatureCount()-1):
    lString = osgeo.ogr.Geometry(osgeo.ogr.wkbLineString)  

    feature1 = layer.GetFeature(i)
    feature2 = layer.GetFeature(i+1)

    # When it's a new line, the sequential number restart to 1, so we don't want that line
    if feature1.GetField("SEQ") < feature2.GetField("SEQ"):
        geom1 = feature1.GetGeometryRef()
        geom2 = feature2.GetGeometryRef()

        geom1x = geom1.GetX()
        geom1y = geom1.GetY()
        geom2x = geom2.GetX()
        geom2y = geom2.GetY()

        lString.AddPoint(geom1x, geom1y)
        lString.AddPoint(geom2x, geom2y)     # Adding the destination point

        #-- Adding the information from the source file to the output
        feat = osgeo.ogr.Feature(outLayer.GetLayerDefn())
        feat.SetGeometry(lString)
        feat.SetField("line_no", feature1.GetField("line_no"))
        feat.SetField("From_SEQ", feature1.GetField("SEQ"))
        feat.SetField("To_SEQ", feature2.GetField("SEQ"))
        outLayer.CreateFeature(feat)

print "The End"

बिंदु की प्रत्येक जोड़ी एक सिंगल लाइन बनाएगी। ऐसा करने का एक और अधिक सुंदर तरीका हो सकता है, लेकिन इसने लगभग 15 सेकंड में 3900 लाइनें बनाईं, इसलिए यह मेरे लिए काम करता है ...


धन्यवाद, बड़े पैमाने पर विस्तार की तरह दिखता है .. जो वास्तव में मेरे लिए उपयोगी होना चाहिए। मैं कोशिश करूंगा और फिर प्रतिक्रिया दूंगा। अभी के लिए धन्यवाद।
एनालिसा मिनेली

3

आप इन दो उपकरणों का उपयोग कर सकते हैं XY इवेंट लेयर और पॉइंट्स टू लाइन बनाते हैं, पॉइंटर्स टू लाइन (लाइन फील्ड, सॉर्ट पॉइंट्स) में पॉइंटर्स की जरूरत को देखते हुए और इनपुट टेबल डेटा को अपडेट करते हैं, कार्य सरल हो सकता है


1

यह सिर्फ @ चादकोपर के जवाब का एक अपडेट है, क्योंकि "दा" कर्सर अब लाभप्रद रूप से पिछले अभिशापों की जगह ले रहे हैं:

with arcpy.da.SearchCursor(input_table,[orig_namefield,x1,y1,x2,y2] ) as in_rows:
    with arcpy.da.InsertCursor(output_lines,["SHAPE@",name_field]) as cursor:
        for row in in_rows:
            # build array for line segment
            array = arcpy.Array([arcpy.Point(row[1],row[2]),arcpy.Point(row[3],row[4])])
            # Create a Polyline object based on the array of points
            polyline = arcpy.Polyline(array)
            # Insert the feature
            cursor.insertRow([polyline,row[0]])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.