घुमावदार बिंदु से बिंदु "मार्ग मानचित्र"


39

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

उड़ान पथ

PostGIS में, क्या ST_MakeLine का कार्यान्वयन है जो आपको 2 अंक होने पर उपयोग करने के लिए वक्र की मात्रा निर्दिष्ट करने की अनुमति देगा?

जब मैं वर्तमान में PostGIS और QGIS का उपयोग कर रहा हूं, मैं अन्य सॉफ्टवेयर विकल्पों के बारे में सुनवाई का स्वागत करूंगा जो समान उपस्थिति बनाने में सक्षम हो सकते हैं।


किसी को भी इस के किसी भी अच्छा कार्यान्वयन के बारे में पता है? उदाहरण या जो भी?
मार्क बोल्डर

जवाबों:


26

महान मंडलियां बनाने से आपको वांछित प्रभाव मिल सकता है।

शायद कुछ इस तरह की चर्चा http://lists.osgeo.org/pipermail/postgis-users/2008-Febdays/018620.html पर की गई

अद्यतन करें:

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

SELECT ST_Transform(
  ST_Segmentize(
    ST_MakeLine(
      ST_Transform(a.the_geom, 953027),
      ST_Transform(b.the_geom, 953027)
    ), 
  100000), 
4326)

(953027 के लिए सीआरएस परिभाषा यहां पाई जा सकती है: http://spatialreference.org/ref/esri/53027/ )

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


4
मुझे यह विचार पसंद है, हालांकि महान मंडलियों के साथ, आप जिस समस्या को चलाते हैं, वह यह है कि छोटी दूरी पर आप अभी भी आम तौर पर सीधी रेखा के साथ समाप्त हो जाएंगे। मैं उस चाप की मात्रा को नियंत्रित करने में सक्षम होना चाहूंगा, जिसे मैंने लाइन में रखा है (यानी- arclength = दूरी * 2)।
रयानडाल्टन

1
यहाँ समस्या का एक अच्छा उदाहरण है केवल महान हलकों का उपयोग करके: gc.kls2.com/cgi-bin/…
RyanDalton

1
कुछ अतिरिक्त शोध के बाद, मुझे यह पद मिला जो इस पद्धति की सहायता के लिए उपयोगी हो सकता है। mail-archive.com/postgis-users@postgis.refractions.net/…
रयानडाल्टन

भविष्य के पाठक के उपयोग के लिए, मुझे लगा कि मैं अभी आगे जाऊंगा और इस विषय को कवर करने वाले @ हाल ही के ब्लॉग पोस्ट से लिंक करूंगा। underdark.wordpress.com/2011/08/20/…
रयानडाल्टन

एक दम बढ़िया!! उपयोगकर्ता चेकइन और स्थल स्थानों के बीच की रेखाएँ खींचने के लिए मेरी परियोजना में प्रयुक्त, फोर्स्करे
लोरेंजो बारबगली

24

समस्या यह देखने के लिए है कि उनके दृश्य रिज़ॉल्यूशन को बढ़ाने के लिए आर्क्स को कितना मोड़ना है।

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

सरलता के लिए, हम मानचित्र पर परिपत्र आर्क्स का उपयोग करते हैं। "मोड़" बिंदु से एक चाप में का एक प्राकृतिक उपाय y बात करने के लिए एक्स पर अपने असर के बीच अंतर है y और सीधे से असर y के लिए एक्स । ऐसा चाप एक वृत्त का एक क्षेत्र है जिस पर y और x दोनों झूठ बोलते हैं; प्राथमिक ज्यामिति से पता चलता है कि झुकने वाला कोण चाप में शामिल आधे कोण के बराबर है ।

एक एल्गोरिथ्म का वर्णन करने के लिए हमें थोड़ा अधिक अंकन की आवश्यकता है। चलो y उद्गम स्थल हो (रूप में नक्शे पर अनुमान) और जाने x_1 , x_2 , ..., x_n गंतव्य अंक हो। परिभाषित करें a_i को y से x_i , i = 1, 2, ..., n तक वहन करें ।

प्रारंभिक चरण के रूप में, मान लें कि बीयरिंग (सभी 0 और 360 डिग्री के बीच) आरोही क्रम में हैं: इसके लिए हमें बीयरिंगों की गणना करने और फिर उन्हें क्रमबद्ध करने की आवश्यकता होती है; दोनों सीधे कार्य हैं।

आदर्श रूप से, हम कुछ शुरुआती असर के सापेक्ष आर्क्स के बीयरिंग को 360 / n , 2 * 360 / n आदि के बराबर करना चाहेंगे । वांछित बीयरिंग और वास्तविक बीयरिंग के बीच मतभेद इसलिए बराबर मैं * 360 / n a_i प्लस शुरू करने असर, - a0 । सबसे बड़ा अंतर इन एन मतभेदों की अधिकतम है और सबसे छोटा अंतर उनकी न्यूनतम है। आइए अधिकतम और मिनट के बीच आधा होने के लिए a0 सेट करें ; यह शुरुआती असर के लिए एक अच्छा उम्मीदवार है क्योंकि यह झुकने की अधिकतम मात्रा को कम करता है जो घटित होगा । नतीजतन, परिभाषित करें

b_i = i * 360 / n - a0 - a_i:

यह उपयोग करने के लिए झुकने है

यह प्राथमिक ज्यामिति की बात है कि y से x तक एक गोलाकार चाप खींचना है जो 2 b_i के कोण को घटाता है, इसलिए मैं विवरणों को छोड़ दूंगा और सीधे एक उदाहरण पर जाऊंगा। 64, 16, और 4 यादृच्छिक बिंदुओं के लिए आयताकार मानचित्र के भीतर दिए गए समाधानों के चित्र यहां दिए गए हैं

वैकल्पिक शब्द

वैकल्पिक शब्द

वैकल्पिक शब्द

जैसा कि आप देख सकते हैं, समाधान अच्छे लगते हैं क्योंकि गंतव्य बिंदुओं की संख्या बढ़ जाती है। N = 4 के लिए समाधान स्पष्ट रूप से दिखाता है कि बीयरिंग कैसे समान रूप से दूरी पर हैं, इस मामले में अंतर 360/4 = 90 डिग्री के बराबर होता है और जाहिर है कि रिक्ति बिल्कुल हासिल की जाती है।

यह समाधान सही नहीं है: आप शायद कई आर्क्स की पहचान कर सकते हैं जो कि ग्राफिक को बेहतर बनाने के लिए मैन्युअल रूप से ट्विक किए जा सकते हैं। लेकिन यह एक भयानक काम नहीं करेगा और वास्तव में अच्छी शुरुआत होगी।

एल्गोरिथ्म में सरल होने का गुण भी है: सबसे जटिल भाग में उनके बीयरिंगों के अनुसार स्थलों को क्रमबद्ध करना शामिल है।


कोडिंग

मैं PostGIS नहीं जानता, लेकिन शायद उदाहरणों को आकर्षित करने के लिए मैंने जो कोड इस्तेमाल किया था, वह पोस्टगिस (या किसी अन्य जीआईएस) में इस एल्गोरिदम को लागू करने के लिए एक मार्गदर्शक के रूप में काम कर सकता है।

निम्नलिखित पर विचार करें pseudocode (लेकिन Mathematica इसे निष्पादित करेगा :-)। (यदि यह साइट TeX का समर्थन करती है, जैसा कि गणित, आँकड़े और TCS वाले करते हैं, तो मैं इसे बहुत अधिक पठनीय बना सकता था ।) संकेतन में शामिल है।

  • परिवर्तनीय और फ़ंक्शन नाम केस-संवेदी होते हैं।
  • [अल्फा] एक लोअर-केस ग्रीक चरित्र है। ([Pi] का मूल्य है जो आपको लगता है कि यह होना चाहिए।)
  • x [[i]] एक सरणी x का तत्व i है (अनुक्रमित १ पर शुरू)।
  • f [a, b] तर्क a और b के लिए फ़ंक्शन f लागू करता है। उचित मामले में कार्य, जैसे 'न्यूनतम' और 'तालिका', प्रणाली-परिभाषित हैं; शुरुआती निचले अक्षर वाले अक्षर, जैसे 'कोण' और 'ऑफसेट', उपयोगकर्ता-परिभाषित हैं। टिप्पणियां किसी भी अस्पष्ट प्रणाली के कार्यों (जैसे 'अर्ग') की व्याख्या करती हैं।
  • सारणी [f [i], {i, 1, n}] सरणी {f [1], f [2], ..., f [n]} बनाता है।
  • वृत्त [o, r, {a, b}], त्रिज्या r के कोण पर केन्द्रित कोण a से कोण b (दोनों रेडियन वामावर्त में दोनों पूर्व की ओर से समतल) का एक चाप बनाता है।
  • आदेश देना [x] x के छांटे गए तत्वों के अनुक्रमित की एक सरणी देता है। x [[ऑर्डरिंग [x]]] x का सॉर्ट किया गया संस्करण है। जब y की लंबाई x के समान होती है, तो y [[क्रम [x]]] x के साथ समानांतर रूप से y होता है।

कोड का निष्पादन योग्य भाग दयालु रूप से छोटा है - 20 से कम रेखाएं - क्योंकि इसका आधा भाग या तो घोषणात्मक ओवरहेड या टिप्पणियां हैं।

नक्शा खींचना

zस्थलों की एक सूची है और yमूल है।

circleMap[z_List, y_] := 
Module[{\[Alpha] = angles[y,z], \[Beta], \[Delta], n},
    (* Sort the destinations by bearing *)
    \[Beta] = Ordering[\[Alpha]];
    x = z[[\[Beta] ]]; (* Destinations, sorted by bearing from y *)
    \[Alpha] = \[Alpha][[\[Beta]]]; (* Bearings, in sorted order *)
    \[Delta] = offset[\[Alpha]];
    n = Length[\[Alpha]];
    Graphics[{(* Draw the lines *)
        Gray, Table[circle[y, x[[i]],2 \[Pi] i / n + \[Delta] - \[Alpha][[i]]], 
             {i, 1, Length[\[Alpha]]}],
        (* Draw the destination points *)
        Red, PointSize[0.02], Table[Point[u], {u, x}]
    }]
]

X -> y असर के सापेक्ष कोण पर xबिंदु से बिंदु तक एक गोलाकार चाप बनाएं ।y\[Beta]

circle[x_, y_, \[Beta]_] /; -\[Pi] < \[Beta] < \[Pi] := 
Module[{v,  \[Rho], r, o, \[Theta], sign},
    If[\[Beta]==0, Return[Line[{x,y}]]];

    (* Obtain the vector from x to y in polar coordinates. *)
    v = y - x; (* Vector from x to y *)
    \[Rho] = Norm[v]; (* Length of v *)
    \[Theta] = Arg[Complex @@ v]; (* Bearing from x to y *)

    (* Compute the radius and center of the circle.*)
    r = \[Rho] / (2 Sin[\[Beta]]); (* Circle radius, up to sign *)
    If[r < 0, sign = \[Pi], sign = 0];
    o = (x+y)/2 + (r/\[Rho]) Cos[\[Beta]]{v[[2]], -v[[1]]}; (* Circle center *)

    (* Create a sector of the circle. *)
    Circle[o, Abs[r], {\[Pi]/2 - \[Beta] + \[Theta] + sign, \[Pi] /2 + \[Beta] + \[Theta] + sign}]
]

एक मूल से बीयरिंगों की गणना बिंदुओं की सूची के लिए करें।

angles[origin_, x_] := Arg[Complex@@(#-origin)] & /@ x;

बीयरिंगों के एक सेट के अवशेषों की midrange की गणना करें।

xक्रमबद्ध क्रम में बीयरिंगों की एक सूची है। आदर्श रूप से, x [[i]] ~ 2 [Pi] i / n।

offset[x_List] :=
Module[
    {n = Length[x], y},
    (* Compute the residuals. *)
    y = Table[x[[i]] - 2 \[Pi] i / n, {i, 1, n}];
    (* Return their midrange. *)
    (Max[y] + Min[y])/2
]

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

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

1
@Kirk वे शायद किसी को मैन्युअल रूप से कार्टोग्राफी करने के लिए भुगतान करते हैं :-)। मैं इस सवाल से प्रेरित था कि यह देखने के लिए कि क्या एक सरल दृष्टिकोण काफी अच्छे ग्राफिक्स बना सकता है। जवाब आशाजनक लग रहा है। वैसे, इन ग्राफिक्स का निर्माण माथमेटिका 8 द्वारा अपने सर्कल और पॉइंट प्राइमेटिव्स और सर्कल सेंटरों को खोजने के लिए थोड़ा वेक्टर अंकगणितीय द्वारा किया गया था।
whuber

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

@ व्हुबेर- अपडेटेड स्यूडोकोड के लिए धन्यवाद। हमें देखना होगा कि क्या हम वास्तव में इसे PostGIS में लागू कर सकते हैं।
रयानडाल्टन

5

ST_CurveToLine आज़माएं

उदाहरण के लिए कुछ इस तरह:

SELECT ST_CurveToLine('CIRCULARSTRING(1 1,5 3,10 1)'::geometry) as the_geom;

आप टेक्स्ट बॉक्स में क्वेरी को कॉपी करके और http://www.postgisonline.org/map.php पर Map1 दबाकर इसकी कल्पना कर सकते हैं


मैं "दो बिंदु" linestrings का एक सेट वक्र करने की कोशिश कर रहा है।
ब्रेंट एडवर्ड्स


3

मैं इसे समाप्त करने की कोशिश कर रहा था, @Nicklas Avén द्वारा सुझाए गए ST_CurveToLine फ़ंक्शन का उपयोग करके "दो बिंदु" लाइनस्ट्रेस के एक सेट को वक्र करने के लिए।

मैंने ST_OffsetCurve फ़ंक्शन के लिए निम्नलिखित 3 समन्वय सेट पास किए:

  1. मूल पंक्ति का प्रारंभ
  2. मूल रेखा के समानांतर एक लाइन ऑफसेट का मध्य बिंदु
  3. मूल पंक्ति का अंत

मैंने अपने उदाहरण में मूल लाइन की लंबाई की ऑफसेट - 1/10 वीं की गणना करने के लिए ST_OffsetCurve फ़ंक्शन का उपयोग किया।

यहाँ एसक्यूएल I का उपयोग मूल सीधी रेखाओं से घुमावदार रेखाओं को उत्पन्न करने के लिए किया गया है:

    ST_CurveToLine('CIRCULARSTRING(' || st_x(st_startpoint(the_geom)) || ' ' || st_y(st_startpoint(the_geom)) || ', ' || st_x(st_centroid(ST_OffsetCurve(the_geom, st_length(the_geom)/10, 'quad_segs=4 join=bevel'))) || ' ' || st_y(st_centroid(ST_OffsetCurve(the_geom, st_length(the_geom)/10, 'quad_segs=4 join=bevel'))) || ', ' || st_x(st_endpoint(the_geom)) || ' ' ||  st_y(st_endpoint(the_geom)) || ')') AS the_curved_geom

वास्तव में उपयोगी है, लेकिन किसी कारण से परिणाम मेरे श्री का सम्मान नहीं करता है। कोई विचार क्यों?
DMS02

क्या आप कुछ और विवरण प्रदान कर सकते हैं - इनपुट ज्योमेट्री की सामग्री, आउटपुट श्रीड गायब है, अलग-अलग है, त्रुटियां उत्पन्न हुई हैं (क्या एप्लिकेशन (s) - QGIS, PostgreSQL)।
ब्रेंट एडवर्ड्स

जिस तालिका में मैं परिणामी घुमावदार रेखाएँ सम्मिलित करना चाहता हूँ उसमें एक enforce_srid_geom बाधा है। जब मैं क्वेरी को निष्पादित करता हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि यह क्वेरी उस बाधा का उल्लंघन करती है। उस बाधा के बिना एक तालिका के साथ यह काम करता है लेकिन फिर इसे QGIS में जोड़ते समय इसे srid के साथ सूचीबद्ध किया जाता है। 0. मेरी क्वेरी: INSERT INTO परीक्षण (the_curved_geom) का चयन करें [यहां अपनी एसक्यूएल] पंक्तियों से
D002

ज्योमेट्री कॉलम (the_curved_geom) पर postgis.net/docs/ST_GeometryType.html और postgis.net/docs/ST_SRID.html फ़ंक्शंस चलाने की कोशिश करें और जांचें कि क्या आपके टेस्ट टेबल और enforce_srid_geom के साथ संघर्ष हैं। यदि हां, तो आप आवश्यकतानुसार ज्योमेट्री / सिड को रूपांतरित कर सकते हैं या अपनी परीक्षा तालिका / बाधा को संशोधित कर सकते हैं।
ब्रेंट एडवर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.