देशांतर \ अक्षांश से कार्टेसियन निर्देशांक में परिवर्तित करना


103

मेरे पास अक्षांश और देशांतर ( WGS-84 ) के रूप में दिए गए कुछ पृथ्वी-केंद्रित समन्वय बिंदु हैं ।

पृथ्वी के केंद्र में उत्पत्ति के साथ मैं उन्हें कार्टेशियन निर्देशांक (x, y, z) में कैसे बदल सकता हूं?


1
क्या आप WGS-84 देशांतर और अक्षांश को कार्तीय निर्देशांक में बदलने में कामयाब रहे हैं? मेरा भी उत्थान है। मैंने यहाँ स्वीकृत उत्तर की कोशिश की है, लेकिन यह मुझे सही उत्तर नहीं देता है। मैंने इस वेबसाइट के साथ अपने परिणामों की तुलना की: apsalin.com/convert-geodetic-to-cartesian.aspx
यास्मीन

जवाबों:


46

मैंने हाल ही में डब्ल्यूजीएस -84 डेटा पर "हैवरसाइन फॉर्मूला" का उपयोग करते हुए कुछ ऐसा ही किया है, जो बहुत संतोषजनक परिणामों के साथ "लॉ ऑफ हैवर्सिन" का व्युत्पन्न है।

हां, WGS-84 मानता है कि पृथ्वी एक दीर्घवृत्ताभ है, लेकिन मेरा मानना ​​है कि आपको केवल "हैवर्सिन फॉर्मूला" जैसे दृष्टिकोण का उपयोग करके लगभग 0.5% औसत त्रुटि मिलती है, जो आपके मामले में स्वीकार्य राशि हो सकती है। जब तक आप कुछ फीट की दूरी के बारे में बात नहीं कर रहे हैं और तब भी पृथ्वी की सैद्धांतिक रूप से वक्रता है, तब तक आपके पास कुछ मात्रा में त्रुटि होगी ... यदि आपको अधिक कठोर WGS-84 संगत दृष्टिकोण की आवश्यकता है, तो "विन्सेंटी फॉर्मूला" की जांच करें।

मैं समझता हूं कि स्टारब्ले कहां से आ रहा है, लेकिन अच्छा सॉफ्टवेयर इंजीनियरिंग अक्सर व्यापार के उतार-चढ़ाव के बारे में होता है, इसलिए यह सब उस सटीकता पर निर्भर करता है जो आपको चाहिए कि आप क्या कर रहे हैं। उदाहरण के लिए, "मैनहट्टन डिस्टेंस फॉर्मूला" बनाम "डिस्टेंस फॉर्मूला" के परिणाम की गणना कुछ स्थितियों के लिए बेहतर हो सकती है क्योंकि यह कम्प्यूटेशनल रूप से कम खर्चीला है। सोचो "कौन सा बिंदु निकटतम है?" परिदृश्य जहाँ आपको एक सटीक दूरी माप की आवश्यकता नहीं होती है।

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

क्रिस वेनेस के नाम से एक सज्जन के पास http://www.movable-type.co.uk/scripts/latlong.html पर एक शानदार वेबसाइट है जो कुछ अवधारणाओं को बताती है जिनमें आप रुचि रखते हैं और विभिन्न प्रोग्रामेटिक कार्यान्वयन प्रदर्शित करते हैं; यह आपके x / y रूपांतरण प्रश्न का उत्तर देना चाहिए।


1
0.5% त्रुटि - 0.5% क्या? इस प्रश्न के संदर्भ में यह पृथ्वी की त्रिज्या हो सकती है, इसलिए 0.5% 30 किमी :) हो सकती है
मार्क जूल

2
अपने लिंक की जाँच की। 0.5% उद्धरण दो बिंदुओं के बीच महान-सर्कल दूरी में त्रुटि के लिए है इसलिए इस प्रश्न के लिए कड़ाई से प्रासंगिक नहीं है। मुझे लगता है कि जब कार्टेशियन को लाट-लॉन्ग में परिवर्तित करना पृथ्वी के केंद्र में उत्पत्ति के साथ समन्वय करता है, तो गोलाकार पृथ्वी को ग्रहण करने से होने वाली त्रुटियां महत्वपूर्ण हो सकती हैं। यह स्पष्ट नहीं है questionner करना चाहता है क्या करना कार्तीय निर्देशांक के साथ। या तो यह उनके लिए कुछ विचित्र कारण से काम करने के लिए अधिक सुविधाजनक है, या शायद यह डेटा निर्यात के लिए कुछ आवश्यकता है? यदि उत्तरार्द्ध, सटीकता महत्वपूर्ण होगी।
MarkJ

130

यहाँ जवाब मुझे मिला है:

बस कार्टेशियन समन्वय प्रणाली में परिभाषा को पूरा करने के लिए:

  • x- अक्ष दीर्घ, अक्षांश (0,0) से होकर जाता है, इसलिए देशांतर 0 भूमध्य रेखा से मिलता है;
  • y- अक्ष (0,90) से होकर गुजरता है;
  • और z- अक्ष ध्रुवों से होकर जाता है।

रूपांतरण है:

x = R * cos(lat) * cos(lon)

y = R * cos(lat) * sin(lon)

z = R *sin(lat)

जहाँ R पृथ्वी का अनुमानित त्रिज्या है (उदाहरण 6371 किमी)।

यदि आपके त्रिकोणमितीय कार्यों से रेडियंस (जो वे शायद करते हैं) की अपेक्षा करते हैं, तो आपको पहले अपने देशांतर और अक्षांश को रेडियंस में परिवर्तित करना होगा। आपको स्पष्ट रूप से एक दशमलव प्रतिनिधित्व की आवश्यकता है, न कि डिग्री मिनट / सेकंड ( रूपांतरण के बारे में यहां देखें )।

पीछे रूपांतरण का सूत्र:

   lat = asin(z / R)
   lon = atan2(y, x)

एसिन बेशक चाप साइन है। wikipedia में atan2 के बारे में पढ़ें । रेडियन से डिग्री में वापस कन्वर्ट करने के लिए मत भूलना।

यह पृष्ठ इस के लिए सी # कोड देता है (ध्यान दें कि यह सूत्रों से बहुत अलग है), और यह क्यों सही है, इसके कुछ स्पष्टीकरण और अच्छे आरेख भी हैं,


17
-1 यह गलत है। आप मान रहे हैं कि पृथ्वी एक गोला है, जबकि WGS-84 एक दीर्घवृत्त मानता है।
starblue

42
@starblue: मुझे यकीन नहीं है कि आप दिए गए उत्तर "सही" या "गलत" को लेबल करने की स्थिति में हैं। गोलाकार सन्निकटन (ईसीई-शैली एक्स, वाई, जेड कोर्डर्स को प्राप्त करने के लिए) उपलब्ध लैट / लैंग्स (जो डब्ल्यूजीएस -84 के संदर्भ में संदर्भित हैं) का उपयोग करके या तो मूल पोस्टर की जरूरतों के लिए "पर्याप्त" है, या "पर्याप्त नहीं" है। दूरी और असर अनुमानों के लिए, मैं शर्त लगा सकता हूं कि यह साधारण रूपांतरण ठीक है। यदि वह उपग्रहों का प्रक्षेपण कर रहा है, तो शायद नहीं। आखिरकार, डब्ल्यूजीएस -84 खुद "गलत" है ... इसमें पृथ्वी की सतह का एक आदर्श मॉडल नहीं है; सभी दीर्घवृत्त मॉडल सन्निकटन हैं। बहुत बुरा ओपी ने हमें नहीं बताया कि वह क्या करने की कोशिश कर रहा था।
डैन एच।

11
@ डान एच सवाल WGS-84 के लिए पूछता है, और यदि आप कुछ और जवाब देते हैं तो आपको कम से कम उन मतभेदों / त्रुटि पर चर्चा करनी चाहिए, जो यह जवाब नहीं देता है।
स्टारबेल

@ daphna-shezaf बैक कन्वर्जन नहीं कर सकता ... मैंने रेडियन से लेकर डिग्रियों तक भी किया है, लेकिन परिणाम समान नहीं है ...

धन्यवाद, यह पता लगाने में घंटे खर्च करें कि यह काम क्यों नहीं करता है, मुझे पता चला कि मैंने कुछ कॉस (lat) और पाप (lat) की अदला-बदली की
Aeroson

6

कार्टेशियन में कनवर्ट GPS(WGS84)करने के लिए सिद्धांत https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

निम्नलिखित वह है जो मैं उपयोग कर रहा हूं:

  • GPS (WGS84 (और कार्टेशियन निर्देशांक में देशांतर समान हैं।
  • अक्षांश को WGS 84 दीर्घवृत्त मापदंडों द्वारा परिवर्तित किया जाना चाहिए अर्ध-प्रमुख अक्ष 6378137 मीटर है, और
  • चपटे का पारस्परिक 298.257223563 है।

मैंने एक वीबी कोड संलग्न किया था जो मैंने लिखा था:

Imports System.Math

'Input GPSLatitude is WGS84 Latitude,h is altitude above the WGS 84 ellipsoid

Public Function GetSphericalLatitude(ByVal GPSLatitude As Double, ByVal h As Double) As Double

        Dim A As Double = 6378137 'semi-major axis 
        Dim f As Double = 1 / 298.257223563  '1/f Reciprocal of flattening
        Dim e2 As Double = f * (2 - f)
        Dim Rc As Double = A / (Sqrt(1 - e2 * (Sin(GPSLatitude * PI / 180) ^ 2)))
        Dim p As Double = (Rc + h) * Cos(GPSLatitude * PI / 180)
        Dim z As Double = (Rc * (1 - e2) + h) * Sin(GPSLatitude * PI / 180)
        Dim r As Double = Sqrt(p ^ 2 + z ^ 2)
        Dim SphericalLatitude As Double =  Asin(z / r) * 180 / PI
        Return SphericalLatitude
End Function

कृपया ध्यान दें कि hऊपर की ऊंचाई है WGS 84 ellipsoid

आमतौर पर GPSहमें Hऊपर की MSLऊंचाई देगा। MSLऊंचाई ऊंचाई करने के लिए परिवर्तित किया जाना है hइसके बाद के संस्करण WGS 84 ellipsoidका उपयोग करके geopotential मॉडल EGM96( Lemoine एट अल, 1998 )।
यह 15 आर्क-मिनटों के स्थानिक संकल्प के साथ जियोइड ऊंचाई फ़ाइल के एक ग्रिड को प्रक्षेपित करके किया जाता है।

या यदि आपके पास कुछ स्तर के पेशेवर हैं, तो GPSAltitude H( msl, मतलब समुद्र तल से ऊपर ) है और UNDULATION, आंतरिक तालिका से चुने हुए डेटा के उत्पादन में geoidऔर के बीच संबंध है । आप प्राप्त कर सकते हैंellipsoid (m)h = H(msl) + undulation

कार्टेशियन निर्देशांक द्वारा XYZ करने के लिए:

x = R * cos(lat) * cos(lon)

y = R * cos(lat) * sin(lon)

z = R *sin(lat)

R का मान क्या है?
आईच

4
मुझे लगता है कि यह गोले की त्रिज्या है, जो पृथ्वी के लिए 6371 किमी है।
मथियास

5

Proj.4 सॉफ्टवेयर एक कमांड लाइन कार्यक्रम है कि रूपांतरण कर सकते हैं, उदाहरण के लिए प्रदान करता है

LAT=40
LON=-110
echo $LON $LAT | cs2cs +proj=latlong +datum=WGS84 +to +proj=geocent +datum=WGS84

यह सी एपीआई भी प्रदान करता है । विशेष रूप से, फ़ंक्शन pj_geodetic_to_geocentricपहले एक प्रक्षेपण वस्तु को स्थापित किए बिना रूपांतरण करेगा।


5

Python3.x में इसका उपयोग करके किया जा सकता है:

# Converting lat/long to cartesian
import numpy as np

def get_cartesian(lat=None,lon=None):
    lat, lon = np.deg2rad(lat), np.deg2rad(lon)
    R = 6371 # radius of the earth
    x = R * np.cos(lat) * np.cos(lon)
    y = R * np.cos(lat) * np.sin(lon)
    z = R *np.sin(lat)
    return x,y,z

3

यदि आप एक गोले के बजाय एक दीर्घवृत्त के आधार पर निर्देशांक प्राप्त करने के बारे में परवाह करते हैं, तो http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF पर एक नज़र डालें - सूत्र आपको रूपांतरण के लिए आवश्यक WGS84 स्थिरांक के साथ-साथ सूत्र भी देते हैं। ।

सूत्र भी संदर्भ दीर्घवृत्त सतह के सापेक्ष ऊंचाई को ध्यान में रखते हैं (उपयोगी यदि आप जीपीएस डिवाइस से ऊंचाई डेटा प्राप्त कर रहे हैं)।


यहां तक ​​कि आपने यहां लिंक की सामग्री पोस्ट नहीं की, फिर भी अपवोटिंग।
मैड फिजिसिस्ट

2

कुछ ऐसा क्यों लागू करें जो पहले से ही लागू हो और परीक्षण-सिद्ध हो?

C #, एक के लिए, NetTopologySuite है जो JTS टोपोलॉजी सूट का .NET पोर्ट है।

विशेष रूप से, आपकी गणना में एक गंभीर दोष है। पृथ्वी एक आदर्श क्षेत्र नहीं है, और पृथ्वी की त्रिज्या का अनुमान सटीक माप के लिए इसमें कटौती नहीं कर सकता है।

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


1
+1। एक विश्वसनीय लाइब्रेरी का उपयोग करना होमब्रेक फ़ंक्शन की तुलना में अधिक सटीक है और आसान भी है
MarkJ

5
NetTopologySuite कैसे लंबे / देर से कार्टेशन में परिवर्तित होता है?
16

1
एनटीएस में रूपांतरण क्षमताओं का समन्वय शामिल नहीं है, शायद आपको Proj.NET projnet.codeplex.com की
D_Guidi

6
हास्यास्पद, जवाब भी रूपांतरण क्षमता प्रदान नहीं करता है।
Motes

1
Coordinate[] coordinates = new Coordinate[3];
coordinates[0] = new Coordinate(102, 26);
coordinates[1] = new Coordinate(103, 25.12);
coordinates[2] = new Coordinate(104, 16.11);
CoordinateSequence coordinateSequence = new CoordinateArraySequence(coordinates);

Geometry geo = new LineString(coordinateSequence, geometryFactory);

CoordinateReferenceSystem wgs84 = DefaultGeographicCRS.WGS84;
CoordinateReferenceSystem cartesinaCrs = DefaultGeocentricCRS.CARTESIAN;

MathTransform mathTransform = CRS.findMathTransform(wgs84, cartesinaCrs, true);

Geometry geo1 = JTS.transform(geo, mathTransform);

क्या आप विस्तृत कर पाएंगे? मैंने एक सरल एप्लिकेशन बनाया है जो आपके दृष्टिकोण का उपयोग करके एक एकल समन्वय को बदलने में सक्षम बनाता है। हालांकि यह हमेशा विफल रहता है क्योंकि स्रोत के आयाम (2) और लक्ष्य के आयाम (3) अलग-अलग होते हैं, जिसके परिणामस्वरूप अपवाद होता हैjava.lang.IllegalArgumentException: dimension must be <= 3
ऑस्क्रिनेक

हम्म् ... मैंने JTS को थोड़ा सा देखा है। नई लाइनस्ट्रीम और () सहित लाइनें JTS जैसी दिखती हैं। लेकिन मुझे JTS में CRS और ट्रांसफ़ॉर्म सामान दिखाई नहीं देता। So: वे वहाँ हैं और मैं उन्हें याद कर रहा हूँ? वहाँ थे, और 1.12 में हटा दिया गया? या: यह एक अलग पुस्तकालय है?
दान एच।

0

आप इसे जावा पर इस तरह से कर सकते हैं।

public List<Double> convertGpsToECEF(double lat, double longi, float alt) {

    double a=6378.1;
    double b=6356.8;
    double N;
    double e= 1-(Math.pow(b, 2)/Math.pow(a, 2));
    N= a/(Math.sqrt(1.0-(e*Math.pow(Math.sin(Math.toRadians(lat)), 2))));
    double cosLatRad=Math.cos(Math.toRadians(lat));
    double cosLongiRad=Math.cos(Math.toRadians(longi));
    double sinLatRad=Math.sin(Math.toRadians(lat));
    double sinLongiRad=Math.sin(Math.toRadians(longi));
    double x =(N+0.001*alt)*cosLatRad*cosLongiRad;
    double y =(N+0.001*alt)*cosLatRad*sinLongiRad;
    double z =((Math.pow(b, 2)/Math.pow(a, 2))*N+0.001*alt)*sinLatRad;

    List<Double> ecef= new ArrayList<>();
    ecef.add(x);
    ecef.add(y);
    ecef.add(z);

    return ecef;


}

पैरामीटर ऑल्ट क्या है?
बालमन

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