पॉली लाइन के साथ दूरी के अंत बिंदु से एक पॉलीलाइन पर एक बिंदु प्राप्त करें


10

मेरे पास पॉलीलाइन का बिंदु और अंत बिंदु है। मैं दी गई दूरी द्वारा निर्दिष्ट अंतिम बिंदुओं से उस पॉलीलाइन पर एक बिंदु कैसे प्राप्त कर सकता हूं।

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

आर्कफी का उपयोग करके मैं इसे कैसे प्राप्त कर सकता हूं बशर्ते कि यह स्क्रिप्ट किसी भी मॉड्यूल को आयात किए बिना ArcView पर काम करे ( जैसे यह उत्तर )। मैं कठिन कोड मानों के लिए प्रयास कर रहा हूं।

संबंधित प्रश्न:


क्या आपको object.interpolate (दूरी [, सामान्यीकृत = गलत]] का उपयोग करके कोई परिणाम नहीं मिल रहा है?
विनयन

1
आप कहाँ से मिली object.interpolate(distance[, normalized=False])। क्या यह आर्कपी की एक विधि है? यदि वह है, तो क्या आप लिंक पोस्ट कर सकते हैं। मैंने इसे देखा, लेकिन यह नहीं पाया।
उपयोगकर्ता

यह आकार देने की विधि है .. Toblerity.github.com/shapely/… लगता है कि आपने इसे दूसरे प्रश्न में
आज़माया है

2
एक अन्य संबंधित प्रश्न है gis.stackexchange.com/questions/6476/… , जो इस समस्या के व्युत्क्रम की चिंता करता है (बिंदु को दी गई दूरी का पता लगाएं)। दो समाधान बारीकी से संबंधित हैं: एक बार जब पॉलीलाइन को मापने योग्य बना दिया जाता है, तो इसके साथ सभी बिंदुओं को उनकी दूरियों के संदर्भ में संबोधित किया जा सकता है (और मनमाने खंडों को इसके साथ दूरी के आधार पर संबोधित किया जा सकता है)।
whuber

जवाबों:


7

यह "रैखिक संदर्भ" के समान लगता है और यह टूलसेट आर्कव्यू में उपलब्ध होगा। इसके अतिरिक्त, आप इस टूल को बहुत आसानी से स्क्रिप्ट कर सकते हैं।

रैखिक संदर्भ के लिए ESRI सहायता के लिए लिंक


1
+1 यह इस समस्या के लिए स्पष्ट रूप से बनाई गई एक परिपक्व क्षमता का उपयोग करने के अर्थ में "सही" दृष्टिकोण है।
whuber

6

आपकी जरूरतों के आधार पर, जैसा कि @LouisH ने उल्लेख किया है, रैखिक संदर्भ का उपयोग करना निश्चित रूप से जाने का तरीका है। मैंने कुछ कोड को एक साथ जोड़ दिया है, जो आपको हार्ड-कोडिंग तत्वों की नहीं, बल्कि उन्हें मापदंडों के रूप में अनुरोध करने की आवश्यकता को पूरा करना चाहिए।

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

import arcpy
import os
from arcpy import env

#Working directory
wkspace        = arcpy.GetParameterAsText(0)
#Line feature class
rtecls         = arcpy.GetParameterAsText(1)
#Line Unique ID
rtecls_ID      = arcpy.GetParameterAsText(2)
#Table of points to be located
pnttbl         = arcpy.GetParameterAsText(3)
#Field in point table that references line point will be located along
pttbl_rteid    = arcpy.GetParameterAsText(4)
#Distance field in point table
pttbl_dst      = arcpy.GetParameterAsText(5)
#Output Layer, layer is stored in memory.  Features still need to be copied to feature class saved to disk
outlayer       = arcpy.GetParameterAsText(6)
#Output Feature Class - If shapefile, make sure to include ".shp" at the end.
outclass       = arcpy.GetParameterAsText(7)

#Type of feature being located
fttype = "POINT"

#Set Workspace
env.workspace = wkspace

#Build String for input parameters in Linear Referencing tool
pt_props = pttbl_rteid + " " + fttype + " " + pttbl_dst

#Output featureclass path
outfclass = wkspace + os.sep + outclass

# Execute MakeRouteEventLayer
arcpy.MakeRouteEventLayer_lr (rtecls, rtecls_ID, pnttbl, pt_props, outlayer)

#Save feature layer to feature class on disk
arcpy.CopyFeatures_management(outlayer, outfclass)

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


5

इस तरह एक रैखिक संदर्भ समस्या का समाधान without importing any modulesमेरी सीमा से परे है ..

मैंने Shapely2 डी जियोस्पेशियल जियोमेट्रीज के हेरफेर और विश्लेषण के लिए अजगर पैकेज का उपयोग किया है । और यह बीएसडी लाइसेंस प्राप्त है ...)

इसे यहाँ से डाउनलोड करें । 2.6 संस्करण जो केवल वही है जो आर्कगिस 10 आर्कपी का समर्थन करता है..यह एक साधारण इंस्टॉलेशन (1.5 एमबी आकार) है

और अब यहाँ उद्देश्य को प्राप्त करने के लिए चापलूसी स्क्रिप्ट है .. मेरे अजगर को क्षमा करें..आज ही मैंने छोरों, टुपल्स आदि के बारे में सीखा है :)

import arcpy
import math
from arcpy import env

env.workspace = r"C:\testshape"

desc = arcpy.Describe("Rivers.shp")
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor("Rivers.shp")

temptup = ()

# get ESRI geometries out of their cage..
for row in rows:

    feat = row.getValue(shapefieldname)
    partnum = 0
    for part in feat:
        for pnt in feat.getPart(partnum):
            if pnt:
                temptup += ((pnt.X, pnt.Y),)
            else:
                print "Interior Ring:"
        partnum += 1    

# and now the shapely magic :)

import shapely
from shapely.geometry import LineString
lnstr = LineString(temptup)
rsltPoint = lnstr.interpolate(0.5)
print(rsltPoint.x,rsltPoint.y)

नोट : यदि फीचर में वक्र खंड हैं तो यह काम नहीं करेगा


2

मैंने पाया कि मैं जो सोचता हूं वही करने की कोशिश कर रहा हूं। मैं यह सब चापलूसी के माध्यम से करना चाहता था। रैखिक संदर्भ का उपयोग करना मेरे लिए समझ में नहीं आ रहा था क्योंकि मेरे पास पहले से ही घटनाएँ नहीं हैं (और मैं यह पता नहीं लगा सका कि एलआर का उपयोग कैसे किया जाए)। मैंने जो प्रयोग किया था उसका क्रुक्स था

    line = arcpy.Polyline(arrayPts)
    pt = line.positionAlongLine (0.99, 'True')

इसके लिए आर्क 10.1 या उच्चतर की आवश्यकता होती है; मैं यह पता लगाने में सक्षम नहीं था कि यह आर्कइन्फो लाइसेंसिंग स्तर मेरे पास उपलब्ध था (ओपी निर्दिष्ट आर्कवे)।

ऊपर मेरे उदाहरण में, मैं एक बिंदु तय दूरी पर नहीं, बल्कि समग्र पंक्ति लंबाई के एक प्रतिशत से चाहता था। ऐसा करने के लिए, मैंने दूसरा वैकल्पिक तर्क दिया positionAlongLine। यदि आप सिर्फ एक निरपेक्ष दूरी निर्दिष्ट करना चाहते हैं तो आप दूसरा arg छोड़ते हैं। यहाँ डॉक्टर है

फुलर कोड नमूना है

import numpy
ptsList = list()
id = 0

with arcpy.da.SearchCursor('flFL', ["SHAPE@"]) as cursor:
    for row in cursor: 
        arrayPts = row[0].getPart()
        line = arcpy.Polyline(arrayPts)
        pt = line.positionAlongLine (0.99, 'True')
        ptsList.append((id, (pt.getPart().X, pt.getPart().Y)))
        id += 1

array = numpy.array([ptsList], \
numpy.dtype([('idfield',numpy.int32),('XY', '<f8', 2)]))

SR = arcpy.Describe("flFL").spatialReference
arcpy.da.NumPyArrayToFeatureClass(array, 'nsegSamplePts', ['XY'], SR)

'flFL'लाइनों की मेरी विशेषता है जिस पर मैं अंक का पता लगाना चाहता हूं। बहुत तेज दौड़ता है। NumPyArrayToFeatureClassमेरे सभी बिंदुओं को वापस एक फीचरक्लास में डंप करने का एक बहुत अच्छा तरीका था (उस हिस्से के लिए मेरे सहयोगी कर्टिस के लिए धन्यवाद)। W / प्रयोग कर रहा था, Append_managementलेकिन वह थोड़ा धीमा था।


+1 कि साझा करने के लिए धन्यवाद। यह एक अच्छा एक बंद समाधान की तरह दिखता है जब आप मापा पॉलीलाइन स्थापित करने के प्रयास का निवेश नहीं करना चाहते हैं। ध्यान दें कि यह समाधान उस क्रम से निर्धारित पॉलीलाइन के अंतर्निहित अभिविन्यास का उपयोग करता है जिसमें उसके निर्देशांक संग्रहीत होते हैं। अगर उस पर ध्यान नहीं दिया गया, तो आप गलत अंत से शुरू की गई गणना के साथ हवा निकाल सकते हैं। इस प्रकार इस समाधान को बढ़ाने के लिए अच्छा होगा कि उपयोगकर्ता (किसी तरह) को सक्षम करने के लिए - शायद एक छोर के पास एक बिंदु को इनपुट करने के माध्यम से - जो कि पॉलीलाइन की शुरुआत है।
whuber

1
यह निश्चित रूप से सच है। मैं एक जल निकासी नेटवर्क से लाइनों का उपयोग कर रहा हूं जो सभी (माना जाता है) उन्मुख डाउनस्ट्रीम हैं, इसलिए मुझे इससे निपटने की ज़रूरत नहीं थी। यदि लाइन ओरिएंटेशन जानबूझकर नहीं किया गया है, तो इसे पूर्व-प्रक्रिया के रूप में व्यवस्थित किया जा सकता है जो मैंने ऊपर सुझाया था। यदि अभिविन्यास जानबूझकर है, तो कोई भी प्रतिलिपि बना सकता है, फिर से उन्मुख कर सकता है, और मेरे नुस्खा का उपयोग कर सकता है। अंक अभी भी मूल लाइन फीचरक्लास पर ठीक से काम करेंगे, भले ही इसका अभिविन्यास वर्तमान विश्लेषण के अनुकूल न हो।
रोलैंड

1

ओवरकिल हो सकता है, लेकिन यदि आपके पास नेटवर्क विश्लेषण एक्सटेंशन तक पहुंच है, तो आप अपने पॉलीइन्स से नेटवर्क बना सकते हैं और फिर एसए इनपुट को ब्याज की दूरी के रूप में निर्दिष्ट करते हुए अपने इनपुट बिंदुओं के आसपास सेवा क्षेत्र बना सकते हैं। यहाँ बिंदु से 111 मीटर एसए के साथ एक सरसरी उदाहरण है:

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

फिर आपको उन बिंदुओं को खोजना होगा जहां एसए लाइन को पार करता है।


-1

मुझे लगता है कि आप इसे फीचर वर्टिस टू पॉइंट्स (डेटा मैनेजमेंट) विधि से प्राप्त कर सकते हैं। आप यहाँ अधिक जानकारी प्राप्त कर सकते हैं

या आप स्प्लिट लाइन एट पॉइंट (डेटा मैनेजमेंट) की जांच कर सकते हैं

वे पूरी तरह से पर्याप्त नहीं हैं, लेकिन आप अपना कोड लिख सकते हैं ...

मुझे उम्मीद है इससे आपको मदद मिली होगी...


2
ऐसा लगता है कि इन विकल्पों के साथ समस्या यह है कि उन्हें लाइन को विभाजित करने के लिए बिंदु स्थान के पूर्व ज्ञान की आवश्यकता होती है, या इसे विभाजित करने से पहले लाइन पर एक कोने को जोड़ने के लिए। वह बिंदु स्थान वह है जो ऊपर दिए गए प्रश्न में ज्ञात नहीं है, इसलिए इन समाधानों को लागू करना कठिन है।
स्थानिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.