दो सर्किलों के चौराहे की गणना?


29

मैं यह पता लगाने की कोशिश कर रहा हूं कि पृथ्वी की सतह पर दो इंटरसेक्टिंग सर्कल के सामान्य बिंदुओं को गणितीय रूप से कैसे प्राप्त किया जाए, प्रत्येक बिंदु के लिए एक केंद्र Lat / Lon और एक त्रिज्या दिया गया है।

उदाहरण के लिए, दिया गया:

  • लैट / लोन (37.673442, -90.234036) रेडियस 107.5 एनएम
  • लैट / लोन (36.109997, -90.953669) त्रिज्या 145 एनएम

मुझे उनमें से एक के साथ दो चौराहे बिंदु खोजने चाहिए (36.948, -088.158)।

समतल विमान पर इसे हल करना बहुत आसान होगा लेकिन मुझे पृथ्वी की सतह जैसे अपूर्ण क्षेत्र पर समीकरणों को हल करने का कोई अनुभव नहीं है।


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

1
मुझे इकाइयाँ मिलानी चाहिए थीं, जो दायरा एनएम में हैं इसलिए यह अभी भी पृथ्वी की सतह के सापेक्ष थोड़ी दूरी पर है लेकिन कुछ किमी से बड़ा है। वह पैमाना विकृति को कैसे प्रभावित करता है? मैं <1nm से कम के लिए सटीक समाधान खोजने की कोशिश कर रहा हूं, इसलिए इसे सुपर सटीक होने की आवश्यकता नहीं है। धन्यवाद!
विल

यह जानना सब अच्छा है, क्योंकि यह दिखाता है कि आप पृथ्वी के एक गोलाकार मॉडल का उपयोग कर सकते हैं - अधिक जटिल दीर्घवृत्त मॉडल अनावश्यक है।
whuber

@ वाउचर क्या इसका अर्थ यह है कि समस्या को शांत किया जा सकता है: 3 क्षेत्रों के चौराहे को ढूंढें जहां एक क्षेत्र पृथ्वी है, और अन्य दो अपने संबंधित त्रिज्या के साथ बिंदुओं पर केंद्रित हैं?
कर्क कुक्केंडल

@ किर्क हां, यह ऐसा करने का तरीका है, जो पृथ्वी की सतह के एक गोलाकार मॉडल को मानता है। कुछ प्रारंभिक गणनाओं के बाद जो 3 डी में त्रिपक्षीय समस्या के एक विशेष मामले में इसे कम कर देता है। (गणना गोलाकार chords, जो दो छोटे क्षेत्रों की त्रिज्या बन साथ दूरी के लिए गोलाकार आर्क्स के साथ परिवर्तित दूरी की आवश्यकता है।)
whuber

जवाबों:


21

एक बार जब आप पहचान लेते हैं, तो यह विमान की तुलना में अधिक कठिन नहीं है

  1. विचाराधीन बिंदु तीन क्षेत्रों के पारस्परिक अंतर हैं: किसी दिए गए त्रिज्या के स्थान (पृथ्वी की सतह पर) के नीचे स्थित एक गोले, स्थान x2 के नीचे स्थित एक गोले (पृथ्वी की सतह पर) किसी त्रिज्या के नीचे है, और पृथ्वी ही है , जो किसी दिए गए त्रिज्या के O = (0,0,0) पर केंद्रित है।

  2. पृथ्वी की सतह के साथ पहले दो क्षेत्रों में से प्रत्येक का चौराहा एक चक्र है, जो दो विमानों को परिभाषित करता है। तीनों क्षेत्रों के पारस्परिक चौराहे इसलिए उन दो विमानों के चौराहे पर स्थित हैं: एक रेखा

नतीजतन, समस्या एक क्षेत्र के साथ एक पंक्ति को कम करने के लिए कम हो जाती है, जो आसान है।


यहाँ विवरण हैं। इनपुट्स P1 = (lat1, lon1) और P2 = (lat2, lon2) पृथ्वी की सतह पर, एक गोले के रूप में माने जाते हैं, और दो इसी त्रिज्या r1 और r2 हैं।

  1. कन्वर्ट (lat, lon) से (x, y, z) जियोसिंक्टिक निर्देशांक। हमेशा की तरह, क्योंकि हम माप की इकाइयाँ चुन सकते हैं जिसमें पृथ्वी की एक इकाई त्रिज्या हो,

    x = cos(lon) cos(lat)
    y = sin(lon) cos(lat)
    z = sin(lat).
    

    उदाहरण में, P1 = (-90.234036 डिग्री, 37.673442 डिग्री) में जियोसेंट्रिक निर्देशांक X1 = (-0.00323306, -0.7915, 0.61116) और P2 = (-90.952369 डिग्री, 36.109997 डिग्री) में जियोनेट्रिक निर्देशांक x2 = (-0.0134464, -0707577) है। , 0.589337)।

  2. त्रिज्या r1 और r2 (जो गोले के साथ मापा जाता है) को गोले के कोणों में बदलें। परिभाषा के अनुसार, एक समुद्री मील (NM) चाप का 1/60 डिग्री है (जो pi / 180 * 1/60 = 0.0002908888 रेडियन है)। इसलिए, कोण के रूप में,

    r1 = 107.5 / 60 Degree = 0.0312705 radian
    r2 = 145 / 60 Degree = 0.0421788 radian
    
  3. X1 के आसपास त्रिज्या r1 का जियोडेसिक सर्कल पृथ्वी की सतह का चौराहा है, जो कि cos (r1) * X1 में केंद्रित त्रिज्या पाप (r1) के यूक्लिडियन क्षेत्र के साथ है ।

  4. Cos (r1) * X1 के चारों ओर त्रिज्या पाप (r1) के गोले के चौराहे द्वारा निर्धारित विमान और पृथ्वी की सतह X1 के लंबवत है और बिंदु cos (r1) X1 से होकर गुजरती है , जहाँ इसका समीकरण x.x1 = cos है (r1) ("।" सामान्य डॉट उत्पाद का प्रतिनिधित्व करता है ); इसी तरह दूसरे विमान के लिए। उन दो विमानों के चौराहे पर एक अद्वितीय बिंदु x0 होगा जो कि X1 और x2 का रैखिक संयोजन है। लेखन x0 = एक X1 + b * x2 दो प्लेनर समीकरण हैं

    cos(r1) = x.x1 = (a*x1 + b*x2).x1 = a + b*(x2.x1)
    cos(r2) = x.x2 = (a*x1 + b*x2).x2 = a*(x1.x2) + b
    

    इस तथ्य का उपयोग करते हुए कि x2.x1 = X1.x2, जिसे मैं q के रूप में लिखूंगा, समाधान (यदि यह मौजूद है) द्वारा दिया गया है

    a = (cos(r1) - cos(r2)*q) / (1 - q^2),
    b = (cos(r2) - cos(r1)*q) / (1 - q^2).
    

    चल रहे उदाहरण में, मैं a = 0.973503 और b = 0.0260194 की गणना करता हूं।

    जाहिर तौर पर हमें q ^ 2! = 1. की आवश्यकता है। इसका मतलब है कि X1 और x2 न तो एक ही बिंदु और न ही एंटीपोडल बिंदु हो सकते हैं।

  5. अब दो विमानों के प्रतिच्छेदन की रेखा पर अन्य सभी बिंदु x0 से कुछ वेक्टर n के कुछ गुणकों से भिन्न होते हैं जो दोनों विमानों के परस्पर लंबवत होते हैं। क्रॉस उत्पाद

    n = x1~Cross~x2
    

    क्या n प्रदान किया गया काम गैर-शून्य है: एक बार फिर, इसका मतलब है कि X1 और x2 न तो संयोग हैं और न ही इसके विपरीत हैं। (हमें उच्च सटीकता के साथ क्रॉस उत्पाद की गणना करने के लिए ध्यान रखने की आवश्यकता है, क्योंकि इसमें बहुत अधिक रद्दीकरण के साथ घटाव शामिल होता है जब X1 और X2 एक दूसरे के करीब होते हैं।) उदाहरण में, n = (0.0272194, -0.0021254, -0.00803124) ।

  6. इसलिए, हम * प्रपत्र x0 + टी के दो अंक से ऊपर की तलाश n पृथ्वी की सतह पर जो झूठ: यह है कि, उनकी लंबाई इसके तुल्य 1. बराबर होती है, उनके वर्ग लंबाई 1:

    1 = squared length = (x0 + t*n).(x0 + t*n) = x0.x0 + 2t*x0.n + t^2*n.n = x0.x0 + t^2*n.n
    

    X0.n के साथ शब्द गायब हो जाता है क्योंकि x0 (X1 और x2 का रैखिक संयोजन) n के लिए लंबवत है। दो समाधान आसानी से कर रहे हैं

    t = sqrt((1 - x0.x0)/n.n)
    

    और इसका नकारात्मक। एक बार फिर उच्च परिशुद्धता के लिए कहा जाता है, क्योंकि जब X1 और x2 करीब होते हैं, x0.x0 1 के बहुत करीब होता है, जिससे फ्लोटिंग पॉइंट परिशुद्धता का कुछ नुकसान होता है। उदाहरण में, t = 1.07509 या t = -1.07509। चौराहे के दो अंक इसलिए बराबर

    x0 + t*n = (0.0257661, -0.798332, 0.601666)
    x0 - t*n = (-0.0327606, -0.784759, 0.618935)
    
  7. अंत में, हम इन समाधानों को भौगोलिक निर्देशांक में भूस्थैतिक (x, y, z) में परिवर्तित करके (lat, lon) में बदल सकते हैं:

    lon = ArcTan(x,y)
    lat = ArcTan(Sqrt[x^2+y^2], z)
    

    देशांतर के लिए, श्रेणी -180 से 180 डिग्री में सामान्यीकृत अभिरंजित रिटर्निंग मानों का उपयोग करें (कंप्यूटिंग अनुप्रयोगों में, यह फ़ंक्शन x और y दोनों को केवल अनुपात y / x के बजाय तर्क के रूप में लेता है ; इसे कभी-कभी "ATan2" कहा जाता है)।

    मैं दो समाधान (-88.151426, 36.989311) और (-92.390485, 38.238380) प्राप्त करता हूं, आंकड़े में पीले डॉट्स के रूप में दिखाया गया है।

3D आंकड़ा

कुल्हाड़ी भू-दृश्य (x, y, z) निर्देशांक प्रदर्शित करती है। ग्रे पैच पृथ्वी की सतह का हिस्सा -95 से -87 डिग्री देशांतर, 33 से 40 डिग्री अक्षांश (एक डिग्री ग्रैटिकुल के साथ चिह्नित) है। तीनों क्षेत्रों को दिखाने के लिए पृथ्वी की सतह को आंशिक रूप से पारदर्शी बनाया गया है। गणना किए गए समाधानों की शुद्धता इस बात से स्पष्ट होती है कि गोल बिंदुओं के चौराहों पर पीले बिंदु कैसे बैठते हैं।


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

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

8

Ellipsoidal मामला:

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

  1. चौराहे बिंदु पर अनुमान
  2. एक समान अज़िमुथल प्रक्षेपण के केंद्र के रूप में इस अनुमानित चौराहे बिंदु का उपयोग करके दो आधार बिंदुओं को प्रोजेक्ट करें,
  3. 2d अनुमानित स्थान में प्रतिच्छेदन समस्या को हल करें।
  4. यह नया चौराहा बिंदु पुराने से बहुत दूर है, चरण 2 पर वापस जाएं।

यह एल्गोरिथ्म द्विघात रूप से परिवर्तित होता है और एक दीर्घवृत्त पर एक सटीक समाधान प्राप्त करता है। (समुद्री सीमाओं के मामले में सटीकता की आवश्यकता है, क्योंकि यह मछली पकड़ने, तेल और खनिज अधिकारों को निर्धारित करता है)

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


+1 यह एक अद्भुत पेपर है: यहाँ आपका मामूली विवरण न्याय नहीं करता है।
whuber

भूगोल पर मेरा छोटा पेपर भी देखें " भूगोल के लिए एल्गोरिदम" dx.doi.org/10.1007/s00190-012-0578-z (मुफ्त डाउनलोड!) और इन कागजों के लिए इरेटा और addenda geographiclib.sf.net/geod-addenda.html
cffk

1

यह करने के लिए कुछ आर कोड है:

p1 <- cbind(-90.234036, 37.673442) 
p2 <- cbind(-90.953669, 36.109997 )

library(geosphere)
steps <- seq(0, 360, 0.1)
c1 <- destPoint(p1, steps, 107.5 * 1852)
c2 <- destPoint(p2, steps, 145 * 1852)

library(raster)
s1 <- spLines(c1)
s2 <- spLines(c2)

i <- intersect(s1, s2)
coordinates(i)

#        x        y
# -92.38241 38.24267
# -88.15830 36.98740

s <- bind(s1, s2)
crs(s) <- "+proj=longlat +datum=WGS84"
plot(s)
points(i, col='red', pch=20, cex=2)

1

से निम्नलिखित @ whuber का जवाब , यहाँ कुछ जावा कोड है जो दो कारणों के लिए उपयोगी है:

  • यह आर्कटन (जावा के लिए, और शायद अन्य भाषाओं के संबंध में एक गोच को उजागर करता है?)
  • यह संभव किनारों के मामलों को संभालता है, जिसमें @ व्हिबर के उत्तर में उल्लेखित नहीं है।

यह अनुकूलित या पूर्ण नहीं है (मैंने स्पष्ट कक्षाओं को छोड़ दिया है Point), लेकिन चाल करना चाहिए।

public static List<Point> intersection(EarthSurfaceCircle c1, EarthSurfaceCircle c2) {

    List<Point> intersections = new ArrayList<Point>();

    // project to (x,y,z) with unit radius
    UnitVector x1 = UnitVector.toPlanar(c1.lat, c1.lon);
    UnitVector x2 = UnitVector.toPlanar(c2.lat, c2.lon);

    // convert radii to radians:
    double r1 = c1.radius / RadiusEarth;
    double r2 = c2.radius / RadiusEarth;

    // compute the unique point x0
    double q = UnitVector.dot(x1, x2);
    double q2 = q * q;
    if (q2 == 1) {
        // no solution: circle centers are either the same or antipodal
        return intersections;
    }
    double a = (Math.cos(r1) - q * Math.cos(r2)) / (1 - q2);
    double b = (Math.cos(r2) - q * Math.cos(r1)) / (1 - q2);
    UnitVector x0 = UnitVector.add(UnitVector.scale(x1, a), UnitVector.scale(x2, b));

    // we only have a solution if x0 is within the sphere - if not,
    // the circles are not touching.
    double x02 = UnitVector.dot(x0, x0);
    if (x02 > 1) {
        // no solution: circles not touching
        return intersections;
    }

    // get the normal vector:
    UnitVector n = UnitVector.cross(x1, x2);
    double n2 = UnitVector.dot(n, n);
    if (n2 == 0) {
        // no solution: circle centers are either the same or antipodal
        return intersections;
    }

    // find intersections:
    double t = Math.sqrt((1 - UnitVector.dot(x0, x0)) / n2);
    intersections.add(UnitVector.toPolar(UnitVector.add(x0, UnitVector.scale(n, t))));
    if (t > 0) {
        // there's only multiple solutions if t > 0
        intersections.add(UnitVector.toPolar(UnitVector.add(x0, UnitVector.scale(n, -t))));
    }
    return intersections;
}

इसके अलावा, महत्वपूर्ण रूप से, इसके उपयोग पर ध्यान दें atan2- यह उल्टा है कि आप @ व्हॉबर के उत्तर से क्या उम्मीद करेंगे (मुझे पता नहीं क्यों, लेकिन यह काम करता है:

    public static Point toPolar(UnitVector a) {
        return new Point(
                Math.toDegrees(Math.atan2(a.z, Math.sqrt(a.x * a.x + a.y * a.y))),
                Math.toDegrees(Math.atan2(a.y, a.x)));          
    }

0

@Wuhber उत्तर के लिए 'R' कोड काम करना।

P1 <- c(37.673442, -90.234036)
P2 <- c(36.109997, -90.953669) 

#1 NM nautical-mile is 1852 meters
R1 <- 107.5
R2 <- 145

x1 <- c(
  cos(deg2rad(P1[2])) * cos(deg2rad(P1[1])),  
  sin(deg2rad(P1[2])) * cos(deg2rad(P1[1])),
  sin(deg2rad(P1[1]))
);

x2 <- c(
  cos(deg2rad(P2[2])) * cos(deg2rad(P2[1])),
  sin(deg2rad(P2[2])) * cos(deg2rad(P2[1])),
  sin(deg2rad(P2[1]))
);

r1 = R1 * (pi/180) * (1/60)
r2 = R2 * (pi/180) * (1/60)

q = dot(x1,x2)
a = (cos(r1) - cos(r2) * q) / (1 - q^2)
b = (cos(r2) - cos(r1) * q)/ (1 - q^2)

n <- cross(x1,x2)

x0 = a*x1 + b*x2


t = sqrt((1 - dot(x0, x0))/dot(n,n))

point1 = x0 + (t * n)
point2 = x0 - (t * n)

lat1 = rad2deg(atan2(point1[2] ,point1[1]))
lon1= rad2deg(asin(point1[3]))
paste(lat1, lon1, sep=",")

lat2 = rad2deg(atan2(point2[2] ,point2[1]))
lon2 = rad2deg(asin(point2[3]))
paste(lat2, lon2, sep=",")

-1

यदि सर्कल में से एक नॉर्टस्टार है, तो यूनिट क्षेत्र के साथ सबसे आसान तरीका है।

आप नॉर्टस्टार के साथ अपने अक्षांश को माप सकते हैं। फिर आपके पास इस क्षेत्र पर एक सापेक्ष स्थिति है। v1 (0, sin (la), cos (la)) आप पंचांग से दूसरे तारे (Star2) की स्थिति (कोण) को जानते हैं। v2 (sin (lo2) * cos (la2), sin (la2), cos (lo2) * cos (la2)) इसके वैक्टर हैं। गोले के समीकरण से।

lo2 सापेक्ष देशांतर है। इसके अनजाने

आपके और तारिका 2 के बीच का कोण, आप भी माप सकते हैं, (एम) और आप जानते हैं, दो यूनिट वेक्टर का इनरप्रोडक्ट बीच का कोस (कोण) है। cos (m) = dot (v1, v2) u अब सापेक्ष देशांतर (lo2) की गणना कर सकता है। lo2 = acos ((क्योंकि (एम) -पाप (ला) * पाप (LA2)) / (cos (ला) * क्योंकि (LA2)))

आखिरकार आप स्टार 2 के वास्तविक देशांतर को lo2 में जोड़ते हैं। (या उप, आप से पश्चिम की ओर, या पूर्व पर निर्भर करते हैं।) lo2 अब आपका देशांतर है।

मेरी अंग्रेजी के लिए क्षमा करें, मैं इस भाषा को कभी नहीं सीखता।


2 बातें: उत्तरस्टार का मतलब है ध्रुव तारा।

एक और। क्योंकि कोण को अपेक्षाकृत क्षैतिज रूप से मापा जाता है, हमेशा 90-कोण सुधार की आवश्यकता होती है। इसका मी कोण तक मान्य है।

पीएस: वास्तविक कोण का मतलब है: स्टार स्थिति - समय सुधार।


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