पॉलीलाइन के संबंधित आरंभ और अंत विशेषताओं के लिए प्वाइंट आईडी असाइन करना?


9

मेरे पास दो शेपफाइल्स, प्वाइंट और पॉलीलाइन हैं। मैं बिंदु डेटा आईडी (सिस्टमआईडी) के साथ अपनी पॉलीलाइन परत को पॉप्युलेट करने की कोशिश कर रहा हूं जहां रेखाएं शुरू होती हैं जहां वे समाप्त होते हैं; जैसे। दो कॉलम (से और) बनाएं। रेखाओं के पास पहले से ही प्रवाह दिशा है जो उन्हें सौंपी गई है। मैं आर्कहेड्रो टूल का उपयोग कर रहा हूं लेकिन आर्कपी भी ठीक है।

ArcHydro में मैंने एट्रीब्यूट टूल्स का उपयोग करने की कोशिश की है> लाइनों के लिए / से नोड्स उत्पन्न करें लेकिन यह To और से मान बनाता है जो मेरे बिंदु डेटा से नहीं हैं। मेरा दूसरा विकल्प फ़ीचर वर्टिस का उपयोग कर रहा था और परिणाम प्राप्त करने के लिए मेरे बिंदु डेटा तालिका में शामिल होने के लिए सिस्टमआईडी को मिला। लेकिन फिर मुझे पॉलीलाइन लेयर को भी अपडेट करना होगा। मुझे यकीन है कि इसे करने का एक आसान तरीका है।

नोट: सभी रेखाओं के बिंदुओं पर बिंदु नहीं हैं, रिक्त मान उनके लिए ठीक हैं।


तो आपके बिंदुओं में एक फ़ील्ड 'सिस्टमआईडी' है जिसे FNode में जाने की आवश्यकता है, पॉलीलाइन में TNode फ़ील्ड ... क्या यह सही है?
माइकल स्टिमसन

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

यहाँ यह है: gis.stackexchange.com/questions/85082 और यह फ़ीचर वर्टीक्यूज़ टू पॉइंट्स था, न कि पॉइंट्स या फीचर्स टू पॉइंट्स। बहुत सवाल के अंत में आपका क्या उल्लेख है।
क्रिस डब्ल्यू

@ क्रिस, मैं वास्तव में उस एक पर फेलिक्सिप का जवाब पसंद करता हूं । यह केवल दो विशेषता जुड़ता है।
माइकल स्टिमसन

जवाबों:


12

कभी-कभी बॉक्स समाधान से बाहर का उपयोग नहीं करना बेहतर होता है। यही कारण है कि मैं सुझाव देता हूं

  1. नोड लेयर में X Y क्षेत्र को पॉप्युलेट करें, उन्हें पूर्णांक में बदलें, सेमी कहें। स्ट्रिंग फ़ील्ड बनाएँ और पूर्णांक के स्ट्रिंग रिप्रेसेंटेशन को संक्षिप्त करके इसे पॉप्युलेट करें।
  2. आकृति में पहले बिंदु के लिए लिंक तालिका में समान कार्य करें।
  3. नवीनतम बनाए गए फ़ील्ड का उपयोग करके लिंक से नोड्स तालिका में शामिल हों और नोड को फ़ील्ड से स्थानांतरित करें।

गोटो 2, लेकिन नोड को असाइन करने के लिए अंतिम बिंदु का उपयोग करें


पसंद है! जैसे फील्ड calculate कुछ "," + str (दौर (! आकार! .FirstPoint.Y, 3)) str (दौर (! आकार! .FirstPoint.X, 3)) + (अजगर पार्सर) नोड से, के लिए str (दौर (! Shape! .LastPoint.X, 3)) + "," + str (राउंड (!! शेप! .LastPoint.Y, 3)) नोड के लिए, फिर बिंदु के समान (पाठ के रूप में) फिर सम्मिलित हों ... दर्द फेलिक्स के बिना स्थानिक जुड़ने का उत्कृष्ट तरीका! भौगोलिक डेटा (जैसे 7 या 8) के लिए अधिक महत्वपूर्ण अंकों का दौर।
माइकल स्टिमसन

बेहद तेजी से और साथ ही एक पटकथा के माहौल में, जहां बेशक शब्दकोश धीमी तालिका में शामिल हो जाता है
फेलिक्सिप

Int (X * 100) यदि वे मेट्रेस में प्रक्षेपित होते हैं। हमेशा माइकल के कोड का उपयोग करें
फेलिक्सआईपी

निश्चित रूप से उपरोक्त प्रश्न से जुड़ी विधि की तुलना में सरल। कम कदम, कम उपकरण, और कोई लाइसेंस स्तर प्रतिबंध नहीं। एक स्थानिक जुड़ाव को एक नियमित विशेषता में शामिल करने के लिए दिलचस्प विचार शामिल हों।
क्रिस डब्ल्यू

1

मैंने कुछ महीने पहले भी यही काम किया था। मैंने आर्कपी का इस्तेमाल किया लेकिन स्क्रिप्ट यहां पोस्ट करने के लिए बहुत लंबी है इसलिए मैं आपको बताऊंगा कि मैंने क्या किया।

  1. मैंने यह पता लगाने के लिए एक स्थानिक जुड़ाव का उपयोग किया कि कौन से बिंदु / नोड एक विशेष रेखा विशेषता के भीतर थे।

  2. चूँकि स्थानिक जुड़ाव प्रवाह दिशा को ध्यान में नहीं रखता है, इसलिए मैंने यह पता लगाने के लिए आर्कपी का उपयोग किया कि कौन सा प्रारंभ बिंदु था और कौन सा अंतिम बिंदु था। मैं लाइन फीचर के प्रारंभ / अंत कोने के लिए समन्वित जानकारी निकालने के लिए आर्कपी वर्णन फ़ंक्शन का उपयोग करके ऐसा करने में सक्षम था और इनसे जुड़े बिंदुओं के समन्वय मूल्यों की तुलना करता था।

  3. अंत में, एक बार जब मैंने काम किया / जो अंकों से / से थे, तो मैंने मूल पॉलीलाइन डेटासेट में फ़ील्ड्स से / को पॉप्युलेट करने के लिए सेटवैल्यू फ़ंक्शन का उपयोग किया था।

जाहिर है, इससे थोड़ा अधिक है लेकिन मैंने मुख्य बिंदुओं को रेखांकित किया है।


मेरे ज्यामितीय नेटवर्क में, प्रवाह दिशा किसी भी कार्डिनल दिशा में हो सकती है। मैं संभवतः कच्चे निर्देशांक की तुलना से एक प्रवाह दिशा का पता नहीं लगा सकता था जब तक कि मैं एक प्रवाह दिशा रेखापुंज या कुछ समान का उपयोग नहीं कर रहा था। यहां तक ​​कि यह समस्याग्रस्त हो सकता है क्योंकि कभी-कभी पाइपों को प्राकृतिक आकृति के खिलाफ ढलान दिया जाता है या पानी को ऊपर की ओर पंप किया जाता है। आप कैसे निश्चित कर सकते हैं कि आपकी प्रवाह दिशा सही है?
प्रिस्किल्ला

1

मैं @FelixIP से प्रेरित था, लेकिन मैं बिना किसी जोड़ या अतिरिक्त फ़ाइलों के निर्माण के लिए एक समाधान लिखना चाहता था, क्योंकि मेरा नेटवर्क 400K + पाइप और 500K + नोड्स के साथ काफी बड़ा है।

ज्यामितीय नेटवर्क का निर्माण नोड्स के एक्स, वाई को मजबूर करता है और पाइप संयोग से समाप्त होता है। आप इन स्थानों को चाप वाले कर्सर में आकार टोकन के साथ एक्सेस कर सकते हैं और उनका मिलान कर सकते हैं। रेखाओं के आकार का टोकन उस क्रम में शीर्ष रेखाओं की एक सरणी लौटाता है जिसे वे खींचे गए थे। मेरे नेटवर्क में, पाइप का ड्रॉ ऑर्डर भारी मात्रा में QA'd है क्योंकि हम इसका उपयोग फ्लो दिशाओं को सेट करने के लिए करते हैं। तो, पहला शीर्ष पाइप की शुरुआत है, और अंतिम शीर्ष पाइप का अंत है।

संदर्भ: पाइप के शुरू में ASSETID = आईडी की पाइप, UNITID = नोड आईडी, पाइप के अंत में UNITID2 = नोड आईडी।

nodes = "mergeNodes"
pipes = "SEWER_1"

nodeDict = {}
pipeDict = {}

#populate node dictionary with X,Y as the key and node ID as the value
for node in arcpy.da.SearchCursor(nodes, ["UNITID", "SHAPE@XY"]):
    nodeDict[(node[1][0], node[1][1])] = node[0]

#populate pipe dictionary with pipe ID as the key and list of X,Y as values 
#vertices populated in the order that the line was draw
#so that [0] is the first vertex and [-1] is the final vertex
for pipe in arcpy.da.SearchCursor(pipes, ["ASSETID", "SHAPE@"]):
    for arrayOb in pipe[1]:
        for point in arrayOb:
            if pipe[0] in pipeDict:
                pipeDict[pipe[0]].append((point.X, point.Y))
            else: 
                pipeDict[pipe[0]] = [(point.X, point.Y)]

#populate UNITID with the first vertex of the line
#populate UNITID2 with the final vertex of the line
with arcpy.da.UpdateCursor(pipes, ["ASSETID", "UNITID", "UNITID2"]) as cur:
    for pipe in cur:
        if pipeDict[pipe[0]][0] in nodeDict:
            pipe[1] = nodeDict[pipeDict[pipe[0]][0]]
        if pipeDict[pipe[0]][-1] in nodeDict:
            pipe[2] = nodeDict[pipeDict[pipe[0]][-1]]
        cur.updateRow(pipe)

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