मेरे पास अक्षांश और देशांतर ( WGS-84 ) के रूप में दिए गए कुछ पृथ्वी-केंद्रित समन्वय बिंदु हैं ।
पृथ्वी के केंद्र में उत्पत्ति के साथ मैं उन्हें कार्टेशियन निर्देशांक (x, y, z) में कैसे बदल सकता हूं?
मेरे पास अक्षांश और देशांतर ( WGS-84 ) के रूप में दिए गए कुछ पृथ्वी-केंद्रित समन्वय बिंदु हैं ।
पृथ्वी के केंद्र में उत्पत्ति के साथ मैं उन्हें कार्टेशियन निर्देशांक (x, y, z) में कैसे बदल सकता हूं?
जवाबों:
मैंने हाल ही में डब्ल्यूजीएस -84 डेटा पर "हैवरसाइन फॉर्मूला" का उपयोग करते हुए कुछ ऐसा ही किया है, जो बहुत संतोषजनक परिणामों के साथ "लॉ ऑफ हैवर्सिन" का व्युत्पन्न है।
हां, WGS-84 मानता है कि पृथ्वी एक दीर्घवृत्ताभ है, लेकिन मेरा मानना है कि आपको केवल "हैवर्सिन फॉर्मूला" जैसे दृष्टिकोण का उपयोग करके लगभग 0.5% औसत त्रुटि मिलती है, जो आपके मामले में स्वीकार्य राशि हो सकती है। जब तक आप कुछ फीट की दूरी के बारे में बात नहीं कर रहे हैं और तब भी पृथ्वी की सैद्धांतिक रूप से वक्रता है, तब तक आपके पास कुछ मात्रा में त्रुटि होगी ... यदि आपको अधिक कठोर WGS-84 संगत दृष्टिकोण की आवश्यकता है, तो "विन्सेंटी फॉर्मूला" की जांच करें।
मैं समझता हूं कि स्टारब्ले कहां से आ रहा है, लेकिन अच्छा सॉफ्टवेयर इंजीनियरिंग अक्सर व्यापार के उतार-चढ़ाव के बारे में होता है, इसलिए यह सब उस सटीकता पर निर्भर करता है जो आपको चाहिए कि आप क्या कर रहे हैं। उदाहरण के लिए, "मैनहट्टन डिस्टेंस फॉर्मूला" बनाम "डिस्टेंस फॉर्मूला" के परिणाम की गणना कुछ स्थितियों के लिए बेहतर हो सकती है क्योंकि यह कम्प्यूटेशनल रूप से कम खर्चीला है। सोचो "कौन सा बिंदु निकटतम है?" परिदृश्य जहाँ आपको एक सटीक दूरी माप की आवश्यकता नहीं होती है।
"ह्वॉर्सिन फॉर्मूला" के बारे में, इसे लागू करना आसान है और अच्छा है क्योंकि यह "लॉ ऑफ़ कॉसन्स" के बजाय "गोलाकार त्रिकोणमिति" का उपयोग करता है जो कि दो आयामी त्रिकोणमिति पर आधारित है, इसलिए आपको सटीकता का एक अच्छा संतुलन मिलता है। जटिलता पर।
क्रिस वेनेस के नाम से एक सज्जन के पास http://www.movable-type.co.uk/scripts/latlong.html पर एक शानदार वेबसाइट है जो कुछ अवधारणाओं को बताती है जिनमें आप रुचि रखते हैं और विभिन्न प्रोग्रामेटिक कार्यान्वयन प्रदर्शित करते हैं; यह आपके x / y रूपांतरण प्रश्न का उत्तर देना चाहिए।
यहाँ जवाब मुझे मिला है:
बस कार्टेशियन समन्वय प्रणाली में परिभाषा को पूरा करने के लिए:
रूपांतरण है:
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 के बारे में पढ़ें । रेडियन से डिग्री में वापस कन्वर्ट करने के लिए मत भूलना।
यह पृष्ठ इस के लिए सी # कोड देता है (ध्यान दें कि यह सूत्रों से बहुत अलग है), और यह क्यों सही है, इसके कुछ स्पष्टीकरण और अच्छे आरेख भी हैं,
कार्टेशियन में कनवर्ट GPS(WGS84)
करने के लिए सिद्धांत https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates
निम्नलिखित वह है जो मैं उपयोग कर रहा हूं:
मैंने एक वीबी कोड संलग्न किया था जो मैंने लिखा था:
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 आर्क-मिनटों के स्थानिक संकल्प के साथ जियोइड ऊंचाई फ़ाइल के एक ग्रिड को प्रक्षेपित करके किया जाता है।
या यदि आपके पास कुछ स्तर के पेशेवर हैं, तो GPS
Altitude 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)
Proj.4 सॉफ्टवेयर एक कमांड लाइन कार्यक्रम है कि रूपांतरण कर सकते हैं, उदाहरण के लिए प्रदान करता है
LAT=40
LON=-110
echo $LON $LAT | cs2cs +proj=latlong +datum=WGS84 +to +proj=geocent +datum=WGS84
यह सी एपीआई भी प्रदान करता है । विशेष रूप से, फ़ंक्शन pj_geodetic_to_geocentric
पहले एक प्रक्षेपण वस्तु को स्थापित किए बिना रूपांतरण करेगा।
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
यदि आप एक गोले के बजाय एक दीर्घवृत्त के आधार पर निर्देशांक प्राप्त करने के बारे में परवाह करते हैं, तो http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF पर एक नज़र डालें - सूत्र आपको रूपांतरण के लिए आवश्यक WGS84 स्थिरांक के साथ-साथ सूत्र भी देते हैं। ।
सूत्र भी संदर्भ दीर्घवृत्त सतह के सापेक्ष ऊंचाई को ध्यान में रखते हैं (उपयोगी यदि आप जीपीएस डिवाइस से ऊंचाई डेटा प्राप्त कर रहे हैं)।
कुछ ऐसा क्यों लागू करें जो पहले से ही लागू हो और परीक्षण-सिद्ध हो?
C #, एक के लिए, NetTopologySuite है जो JTS टोपोलॉजी सूट का .NET पोर्ट है।
विशेष रूप से, आपकी गणना में एक गंभीर दोष है। पृथ्वी एक आदर्श क्षेत्र नहीं है, और पृथ्वी की त्रिज्या का अनुमान सटीक माप के लिए इसमें कटौती नहीं कर सकता है।
अगर कुछ मामलों में यह होमब्रेव फ़ंक्शंस का उपयोग करने के लिए स्वीकार्य है, तो जीआईएस एक ऐसे क्षेत्र का एक अच्छा उदाहरण है जिसमें एक विश्वसनीय, परीक्षण-सिद्ध पुस्तकालय का उपयोग करना बहुत पसंद किया जाता है।
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);
java.lang.IllegalArgumentException: dimension must be <= 3
आप इसे जावा पर इस तरह से कर सकते हैं।
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;
}