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


22

मैं विभक्ति के बिंदुओं का पता लगाने की कोशिश कर रहा हूं, यानी ऐसे बिंदु जहां एक पंक्ति में वक्र शुरू और अंत होते हैं। यदि आप छवि को देखते हैं, तो ग्रीन लाइन एक सड़क या एक धारा हो सकती है, और काले बिंदु ऐसे बिंदु हैं जहां वक्र शुरू होते हैं और समाप्त होते हैं। यहां छवि विवरण दर्ज करें

इन बिंदुओं की पीढ़ी को स्वचालित करने के लिए उच्च स्तरीय कदम क्या होंगे? मेरे पास ArcGIS डेस्कटॉप है और ArcObjects के साथ काफी काम कर रहा हूं।


स्रोत डेटा लाइन सेगमेंट से बना एक पॉलीलाइन है और आप इसे घटता के साथ जोड़ना चाहते हैं, या क्या पहले से ही आर्क सेगमेंट है?
U2ros

वर्तमान में, यह लाइन सेगमेंट से बना है।
देवदत्त तेंगशे

1
इस प्रश्न में दृष्टांत उल्लेखनीय रूप से esri.com/news/arcuser/0110/turning.html पर प्रकाशित जैसा दिखता है ।
whuber

@ शुभंकर: बहुत ही सूक्ष्म अवलोकन। यह बिल्कुल डेटा स्रोत था जिसका उपयोग मैंने छवि बनाने के लिए किया था।
देवदत्त तेंगशे

जवाबों:


15

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

उदाहरण में लंबे समय तक खिंचाव हैं जहां वक्रता लगभग शून्य है। इससे पता चलता है कि संकेतित बिंदुओं को कम-वक्रता वाले क्षेत्रों के ऐसे हिस्सों के सिरों को अनुमानित करना चाहिए।

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

Rइन विचारों को स्पष्ट करने के लिए यहां कोड काम कर रहा है । आइए निर्देशांक के अनुक्रम के रूप में व्यक्त एक लाइन स्ट्रिंग के साथ शुरू करें:

xy <- matrix(c(5,20, 3,18, 2,19, 1.5,16, 5.5,9, 4.5,8, 3.5,12, 2.5,11, 3.5,3, 
               2,3, 2,6, 0,6, 2.5,-4, 4,-5, 6.5,-2, 7.5,-2.5, 7.7,-3.5, 6.5,-8), ncol=2, byrow=TRUE)

पट्टी एक्स और वाई अलग निर्देशांक वक्र की एक parametrization प्राप्त करने के लिए। (पैरामीटर बुलाया जाएगा time।)

n <- dim(xy)[1]
fx <- splinefun(1:n, xy[,1], method="natural")
fy <- splinefun(1:n, xy[,2], method="natural")

साजिश रचने और अभिकलन के लिए स्प्लीन को इंटरपोल करें :

time <- seq(1,n,length.out=511)
uv <- sapply(time, function(t) c(fx(t), fy(t)))

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

curvature <- function(t, fx, fy) {
  # t is an argument to spline functions fx and fy.
  xp <- fx(t,1); yp <- fy(t,1)            # First derivatives
  xpp <- fx(t,2); ypp <- fy(t,2)          # Second derivatives
  v <- sqrt(xp^2 + yp^2)                  # Speed
  (xp*ypp - yp*xpp) / v^3                 # (Signed) curvature
  # (Left turns have positive curvature; right turns, negative.)
}

kappa <- abs(curvature(time, fx, fy))     # Absolute curvature of the data

मैं वक्र की सीमा के संदर्भ में शून्य वक्रता के लिए एक सीमा का अनुमान लगाने का प्रस्ताव करता हूं । यह कम से कम एक अच्छा प्रारंभिक बिंदु है; इसे वक्र की यातना के अनुसार समायोजित किया जाना चाहिए (जो कि अधिक घटता है)। यह बाद में वक्रता के अनुसार भूखंडों को रंगने के लिए उपयोग किया जाएगा।

curvature.zero <- 2*pi / max(range(xy[,1]), range(xy[,2])) # A small threshold
i.col <- 1 + floor(127 * curvature.zero/(curvature.zero + kappa)) 
palette(terrain.colors(max(i.col)))                        # Colors

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

plot(xy, asp=1, xlab="x",ylab="y", type="n")
tmp <- sapply(2:length(kappa), function(i) lines(rbind(uv[,i-1],uv[,i]), lwd=2, col=i.col[i]))
points(t(sapply(time[diff(kappa < curvature.zero/2) != 0], 
       function(t) c(fx(t), fy(t)))), pch=19, col="Black")
points(xy)

भूखंड

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


हो सकता है कि मैंने जो शब्दावली इस्तेमाल की थी, वह गलत थी। आपने जो ग्रहण किया, वही मैं चाहता था। आपका उत्तर आशाजनक लग रहा है, और मुझे अपने शेपफाइल को संसाधित करने के लिए R के साथ काम करना होगा।
देवदत्त तेंगशे

3

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

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

इस चित्र में, हम तीन चरण देखते हैं:

1- कोण का उपयोग करके रेखा को सघन करें। मैंने पैरामीटर के रूप में 10 डिग्री का उपयोग किया है, और हमने स्प्लिटलाइन का उपयोग किया है। चित्र में, घुमावदार रेखा अपने प्रारंभिक चरण में है।

arcpy.Densify_edit("line" , "ANGLE" , "","",10)
arcpy.SplitLine_management("line" , "line_split")

2- उन सेगमेंट्स का चयन करें, जहाँ shape_length निरर्थक न हो। जैसा कि हम तालिका में देखते हैं, मैंने उन निरर्थक लंबाई का चयन नहीं किया है। फिर, मैं उन्हें एक नए फीचर वर्ग में चुनता हूं।

arcpy.Select_analysis("line_split" , "line_split_selected")

3- हमने रेखाओं के किनारों में स्थित शीर्षकों को निकाला है, जो विभक्ति बिंदु हैं।

arcpy.FeatureVerticesToPoints_management("line_split_selected" , "line_split_pnt" , "DANGLE")

मेरे पास आपके अन्य उत्तर के विषय में समान टिप्पणियां और प्रश्न हैं: यह एक अच्छा विचार है, लेकिन साथ ही यह स्पष्ट नहीं है कि यह वांछित परिणाम देगा, और न ही किसी को थ्रेसहोल्ड कोण चुनना चाहिए। क्या आप आउटपुट का एक चित्रण प्रदान कर सकते हैं ताकि पाठकों का मूल्यांकन कर सकें कि यह प्रस्ताव वास्तव में क्या करता है? ईएसआरआई सॉफ्टवेयर को एक समाधान के हिस्से के रूप में अनुशंसित करते समय काम किए गए उदाहरण प्रदान करना विशेष रूप से महत्वपूर्ण है, क्योंकि उनके एल्गोरिदम आमतौर पर प्रलेखित नहीं होते हैं, जिससे यह जानना असंभव है कि वे क्या कर रहे हैं।
whuber

यह सुनिश्चित करने के लिए कि एक कार्यशील समाधान है, मुझे इसकी जांच करने की आवश्यकता है, लेकिन मैं इसका परीक्षण नहीं कर सकता, मुझे डेटा याद नहीं है, इसलिए मुझे लगता है कि ईएसआरआई द्वारा प्रस्तावित उपकरण उम्मीद की तरह काम करते हैं, लेकिन इस उत्तर की आवश्यकता है आगे परीक्षण किया जाए।
जियोगेक्ट

हम उन्हें विचारों का नाम दे सकते हैं और उत्तर नहीं दे सकते हैं
geogeek

1
क्या आप मुझे टिप्पणी में स्थानांतरित करना चाहेंगे? BTW, यदि आप डेटा का परीक्षण करना चाहते हैं, तो आप कर सकते हैं - एक शुरुआत के लिए - अपने उत्तर में मेरे द्वारा पोस्ट किए गए निर्देशांक का उपयोग करें, क्योंकि वे प्रश्न में चित्रण के करीब हैं। लेकिन किसी भी भौगोलिक डेटा का उपयोग क्यों न करें जो आपके पास है?
whuber

2
हाँ वास्तव में यह समाधान सिर्फ सीधी रेखाओं को निकालने में बेहतर काम कर रहा है।
जियोगेक्ट

1

आप सामान्य उपकरण का उपयोग कर सकते हैं जिसमें एक पैरामीटर के रूप में मूल रेखा से अधिकतम ऑफसेट है, इसलिए आप उन ऑफसेट को चुन सकते हैं जो आपके मामले में फिट बैठता है।

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

यदि हम मूल लाइन "लाइन_क्रूर" का नाम देते हैं, और सामान्यीकृत एक "लाइन_जेन", तो हम "लाइन_जेन" को "लाइन_जेन" क्लिप कर सकते हैं। परिणाम "line_cur" का सीधा खंड होगा। तब हम एक बहुत ही छोटे खंड को एक वर्ग क्वेरी के साथ हटाकर साफ कर सकते थे जो कि शेप_लगमा को उस न्यूनतम सड़क की लंबाई से अधिक का चयन करता है।


यह एक अच्छा विचार है। यह स्पष्ट नहीं है कि व्यवहार में यह कितना अच्छा होगा, हालांकि। क्या आप शायद एक उदाहरण दिखा सकते हैं जो विभक्ति बिंदुओं को दर्शाता है जो पाए जाते हैं?
whuber

मैंने एक तस्वीर को शामिल करने के लिए एक संपादन किया है, चित्र बताता है कि कैसे यह उपकरण सीधे खंडों के साथ चिपका हुआ रेखा बना सकता है, इसलिए हमें पुरानी रेखाओं को एक क्लिप बनाना होगा, सिर्फ पुरानी सीधी रेखाओं के खंडों को निकालने के लिए
geogeek

कुछ भी स्पष्ट नहीं है मैं आपके सवालों का जवाब देने के लिए उपलब्ध हूं?
जियोगेक्ट

मुझे दृष्टांत में पहचाने गए किसी भी विभक्ति बिंदु नहीं दिखते। वे कहाँ होंगे, बिल्कुल? और कैसे सामान्यीकरण के लिए सहिष्णुता का चयन करना चाहिए?
व्हिबर

मुझे परीक्षण करने के लिए कुछ आंकड़ों की आवश्यकता है, लेकिन मुझे लगता है कि हमें प्रयोग द्वारा सहिष्णुता का चयन करना चाहिए
जियोगेक्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.