एक बिंदु और दो अक्षांश / lngs की आभासी रेखा के बीच की दूरी की गणना


14

कृपया उदाहरण और संबंधित छवि देखें।

मैं निम्नलिखित प्राप्त करना चाहूंगा: दो स्थान (lat / lng) प्रदान करें, जिन्हें नीचे A और B के रूप में दिखाया गया है । इससे एक आभासी रेखा खींची जाएगी और फिर इस रेखा और C के बीच की दूरी की गणना की जाएगी (किसी भी माप में)।

चित्रकारी

मैंने इसे वर्तमान में Google मैप्स API v3 में हासिल किया है, लेकिन अपनी पसंद की भाषा में पर्दे के पीछे भी यह प्रदर्शन कर पाऊंगा। किसी भी सुझाव / विचारों की बहुत सराहना की जाएगी!


क्या AB एक महान वृत्त रेखा है?
किर्क कुएकेन्डल

@ किर्क, नहीं, एबी सिर्फ एक सीधी रेखा है
प्रिजनर

@ मिचेल, एक दिलचस्प बिंदु है। मुझे इस पर एक नज़र रखना होगा!
कैदी

@Prisoner @Kirk सचमुच, एक "सीधी रेखा" पृथ्वी की सतह के नीचे से गुजरेगी। सामान्य तौर पर, सतह पर इसका रेडियल प्रक्षेपण वास्तव में एक महान वृत्त का एक खंड होगा (एक गोलाकार पृथ्वी मॉडल का उपयोग करके)।
whuber

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

जवाबों:


6
def get_perp( X1, Y1, X2, Y2, X3, Y3):
    """************************************************************************************************ 
    Purpose - X1,Y1,X2,Y2 = Two points representing the ends of the line segment
              X3,Y3 = The offset point 
    'Returns - X4,Y4 = Returns the Point on the line perpendicular to the offset or None if no such
                        point exists
    '************************************************************************************************ """
    XX = X2 - X1 
    YY = Y2 - Y1 
    ShortestLength = ((XX * (X3 - X1)) + (YY * (Y3 - Y1))) / ((XX * XX) + (YY * YY)) 
    X4 = X1 + XX * ShortestLength 
    Y4 = Y1 + YY * ShortestLength
    if X4 < X2 and X4 > X1 and Y4 < Y2 and Y4 > Y1:
        return X4,Y4
    return None

सबसे कम लंबाई वह दूरी है जिसकी आपको आवश्यकता है, जब तक कि मुझसे गलती न हो?


हां, मैं सी से लाइन सेगमेंट की सबसे छोटी दूरी की तलाश कर रहा हूं। क्या यह गणित की गणना है?
कैदी

1
यह वास्तव में ठीक काम करता था, मैंने निम्नलिखित में तीन बिंदुओं (ए, बी, सी) को पारित किया: i.imgur.com/bK9oB.jpg और यह एक्स / ग्रेट काम के लैट / लैंग के साथ वापस आया!
कैदी

1
@ हर्ष, एक आखिरी बात, मैं इसे निकटतम बिंदु (न सिर्फ लाइन) पर जाने के लिए संशोधित करने के बारे में कैसे जाऊंगा, अगर मैंने इसे एक पंक्ति को जॉय करने के बिंदु पर रखा था, तो मैं इसे दूरी की जांच करने के लिए कैसे प्राप्त कर सकता हूं बिंदु?
कैदी

1
@ हायर गुड शुरुआत, लेकिन ऐसा लगता है कि Noneएक वैध समाधान मौजूद होने पर भी अक्सर यह कोड वापस आ जाता है। समस्या यह है कि अंतिम सशर्त एक्स 1 <एक्स 2 और वाई 1 <वाई 2 मानती है, जिसे हमेशा आश्वासन नहीं दिया जा सकता है। बीच में एक बेहतर परीक्षा की जरूरत है।
whuber

1
@ हर्ष यह लगता है कि आपके और @ कैदी के बीच यह आदान-प्रदान उत्पादक रहा है। मैं इस बात पर जोर देना चाहूंगा कि मेरे पास वोटिंग या अंकों में किसी भी तरह के बदलाव (या यहां तक ​​कि किसी भी नियंत्रण) से कोई लेना-देना नहीं है और यह हो सकता है कि मेरी टिप्पणी केवल आपके उत्तर को बेहतर बनाने में मदद करने के लिए थी।
whuber

11

शायद मैं इसे बहुत जटिल बना रहा हूं, लेकिन आप जो चाहते हैं वह एक बिंदु से एक रेखा तक की दूरी है। यह एबी के साथ एक बिंदु से दूरी है जो एबी को सी के साथ एक लाइन ऑर्थोगोनल के साथ एबी से जोड़ता है। AB के लिए यह वेक्टर लंबवत है

v=[x2-x1, -(y2-y1)] # Point A is [x1,y1] Point B is [x2,y2]

(मैंने वेक्टर, या दो-तत्व सरणी को परिभाषित करने के लिए चौकोर कोष्ठक का उपयोग किया है)। C [xp, yp] और बिंदु A के बीच की दूरी है

u=[x1-xp, y1-xp]

लाइन और C के बीच की दूरी केवल u का v पर प्रक्षेपण है। यदि हम mod (v) = 1 मानते हैं (बस इसे सामान्य करते हैं, तो)

distance = u*v = abs( (x2-x1)*(y1-yp) - (x1-xp)*(y2-y1) )

एकमात्र जटिलता यह है कि आप शायद यह सुनिश्चित करना चाहते हैं कि आपके निर्देशांक WGS84 लैट / लॉग जोड़े नहीं हैं, लेकिन अनुमानित (या भू-भौगोलिक निर्देशांक का उपयोग करें)। आप इसके लिए OGR या Proj4 का उपयोग कर सकते हैं ।


3
त्रिकोणमितीय कार्यों का उपयोग नहीं करने के लिए + कई मिलियन छद्म बिंदु। सभी बहुत से लोग आर्कटन को बाहर निकालते हैं जब उन्हें यह देखना चाहिए: en.wikipedia.org/wiki/Dot_product
Herb

@ उत्तर के लिए धन्यवाद! मैं गूगल मैप्स एपीआई से lat / long का उपयोग कर रहा हूं। मैथ्स का हिस्सा मेरे लिए काफी नया है, इसलिए मैं इसे एक बार जाने दूंगा और देखूंगा कि मैं क्या कर सकता हूं। मैथ्स के साथ कोई टिप्स? जैसे [x2-X1, - (y2-y1)], इसका क्या अनुवाद है?
कैदी

मैंने इसके लिए एक छोटा संपादन जोड़ा है। मूल रूप से, यह एक सरणी संकेतन है, लेकिन यदि आप अपने निर्देशांक को चर X1, x2, y1, y2 और xp, yp में संग्रहीत करते हैं, तो आपको केवल मेरे द्वारा प्रदान किए गए अंतिम समीकरण के दाहिने हाथ की ओर लिखना होगा। यह बहुत ज्यादा मान्य सी, जावा, जेएस, पायथन आदि कोड है :)
जोस

1
@ जज आप C से लाइन AB तक की दूरी की गणना कर रहे हैं । आंकड़े के आधार पर, मेरा मानना ​​है कि ओपी सी से लाइन सेगमेंट एबी तक की दूरी चाहता है । यह जांचने के लिए अतिरिक्त कार्य की आवश्यकता है कि क्या C की लाइन AB पर A और B के बीच का प्रक्षेपण है या नहीं। बाद के मामले में, दो लंबाई सीए और सीबी का उपयोग करें।
whuber

1
@ कैदी मुख्य अंतर यह है कि एक रेखा हमेशा के लिए फैली हुई है (यह केवल एक दिशा सदिश और एक बिंदु या दो बिंदुओं द्वारा परिभाषित होती है), जबकि A और B के बीच एक खंड अनंत रेखा का एक सा है जो A के बीच जाता है। बी (इसकी एक परिमित लंबाई है)
जोस

4

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

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


टिप्पणी के लिए धन्यवाद, लेकिन हेमी इस पर ट्रम्प आया!
कैदी

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

1

यदि आप एंड्रॉइड पर जावा का उपयोग कर रहे हैं, तो लाइब्रेरी फ़ंक्शन के साथ इसकी केवल एक पंक्ति है

import static com.google.maps.android.PolyUtil.distanceToLine;

distanceToLine:

public static double distanceToLine(LatLng p, LatLng start,LatLng end)

बिंदु p और रेखा खंड के बीच के गोले पर दूरी की गणना शुरू होती है।

पैरामीटर: पी - मापा जाने वाला बिंदु

शुरू - लाइन खंड की शुरुआत

अंत - लाइन खंड का अंत

रिटर्न: मीटर में दूरी (गोलाकार पृथ्वी को संभालने)

बस अपने लिए पुस्तकालय जोड़ें

dependencies {
    compile 'com.google.maps.android:android-maps-utils:0.5+'
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.