দ্রাঘিমাংশ - অক্ষাংশ থেকে কার্তেসিয়ান স্থানাঙ্কে রূপান্তর করা


103

অক্ষাংশ এবং দ্রাঘিমাংশ ( ডাব্লুজিএস -৪৮ ) হিসাবে দেওয়া কিছু পৃথিবী কেন্দ্রিক সমন্বিত পয়েন্ট আমার কাছে রয়েছে ।

আমি কীভাবে তাদেরকে পৃথিবীর কেন্দ্রে উত্সের সাথে কার্তেসিয়ান স্থানাঙ্কে (x, y, z) রূপান্তর করতে পারি?


1
আপনি কি ডাব্লুজিএস -৪৪ দ্রাঘিমাংশ এবং অক্ষাংশকে কার্তেসিয়ান স্থানাঙ্কে রূপান্তর করতে পেরেছেন? আমারও উচ্চতা আছে। আমি এখানে গ্রহণযোগ্য উত্তর চেষ্টা করেছি, কিন্তু এটি আমাকে সঠিক উত্তর দেয় না। আমি আমার ফলাফলগুলি এই ওয়েবসাইটের সাথে তুলনা করেছি: apsalin.com/convert-geodetic-to-cartesian.aspx
ইয়াসমিন

উত্তর:


45

আমি সম্প্রতি ডাব্লুজিএস -৪৪ ডেটার উপর "হাভারসাইন ফর্মুলা" ব্যবহার করে এর অনুরূপ কিছু করেছি, যা অত্যন্ত সন্তোষজনক ফলাফল সহ "লস অফ হ্যাভারসাইনস" থেকে প্রাপ্ত iv

হ্যাঁ, ডাব্লুজিএস -৪৪ ধরে নেয় পৃথিবী একটি উপবৃত্তাকার, তবে আমি বিশ্বাস করি আপনি কেবল "হ্যাভারসাইন ফর্মুলা" এর মতো একটি পদ্ধতির ব্যবহার করে প্রায় 0.5% গড় ত্রুটি পেয়ে যা এটি আপনার ক্ষেত্রে গ্রহণযোগ্য পরিমাণ ত্রুটি হতে পারে। আপনি কয়েক ফুট দূরত্বের কথা না বললে আপনার সর্বদা কিছু পরিমাণ ত্রুটি থাকবে এবং তারপরেও পৃথিবীর তাত্ত্বিকভাবে বক্রতা রয়েছে ... আপনার যদি আরও কঠোরভাবে ডাব্লুজিএস -৪৪ সুসংগত পদ্ধতির প্রয়োজন হয় তবে "ভিনসেন্টি ফর্মুলা" চেকআউট করুন।

আমি বুঝতে পারি যে স্টারব্লু কোথা থেকে আসছে, তবে ভাল সফ্টওয়্যার ইঞ্জিনিয়ারিং প্রায়শই ট্রেড অফগুলি সম্পর্কে থাকে, তাই এটি আপনার কাজের জন্য প্রয়োজনীয় সঠিকতার উপর নির্ভর করে। উদাহরণস্বরূপ, "ম্যানহাটান দূরত্ব সূত্র" থেকে গণনা করা ফলাফল বনাম "দূরত্বের সূত্র" থেকে প্রাপ্ত ফলাফলটি কিছু পরিস্থিতিতে আরও ভাল হতে পারে কারণ এটি কম্পিউটারের চেয়ে কম ব্যয়বহুল। "কোন পয়েন্টটি সবচেয়ে নিকটে?" দৃশ্যাবলী যেখানে আপনার একটি নির্দিষ্ট দূরত্ব পরিমাপের প্রয়োজন নেই।

সম্পর্কিত, "হাভারসাইন সূত্র" এটি কার্যকর করা সহজ এবং দুর্দান্ত কারণ এটি দ্বি-মাত্রিক ত্রিকোণমিতির উপর ভিত্তি করে "লস অফ কোসাইন" ভিত্তিক পদ্ধতির পরিবর্তে "স্পেরিকাল ট্রাইগনোমেট্রি" ব্যবহার করে, সুতরাং আপনি নির্ভুলতার একটি সুন্দর ভারসাম্য পেয়েছেন জটিলতা বেশি

ক্রিস ভেনেস নামে এক ভদ্রলোকের http://www.movable-type.co.uk/scriptts/latlong.html এ একটি দুর্দান্ত ওয়েবসাইট রয়েছে যা আপনার আগ্রহী কিছু ধারণাগুলি ব্যাখ্যা করে এবং বিভিন্ন প্রোগ্রামিক বাস্তবায়নের চিত্র প্রদর্শন করে; এটির পাশাপাশি আপনার এক্স / ওয়াই রূপান্তর প্রশ্নেরও উত্তর দেওয়া উচিত।


1
0.5% ত্রুটি - 0.5% কি? এই প্রশ্নের প্রসঙ্গে এটি পৃথিবীর ব্যাসার্ধ হতে পারে, সুতরাং 0.5% 30 কিলোমিটার হতে পারে :)
মার্কজে

2
আপনার লিঙ্কটি পরীক্ষা করে দেখেছে। 0.5% এর উদ্ধৃতি দুটি পয়েন্টের মধ্যে দুর্দান্ত চক্রের ত্রুটির জন্য তাই এই প্রশ্নের সাথে কঠোরভাবে প্রাসঙ্গিক নয়। আমি ভাবব যখন ল্যাট-লংকে পৃথিবীর কেন্দ্রে উত্সের সাথে কার্তেসিয়ান স্থানাঙ্কে রূপান্তরিত করব তখন একটি গোলাকার পৃথিবী ধরে নেওয়া ত্রুটিগুলি উল্লেখযোগ্য হতে পারে। এটা পরিষ্কার না questionner করতে চায় কি না কার্টিজিয়ান স্থানাঙ্ক সঙ্গে। হয় কোনও উদ্ভট কারণে তাদের মধ্যে কাজ করা কেবল আরও সুবিধাজনক, অথবা সম্ভবত তথ্য রফতানির জন্য এটির কোনও প্রয়োজন? যদি দ্বিতীয়টি হয় তবে যথার্থতা গুরুত্বপূর্ণ হবে।
মার্কজে

129

আমি যে উত্তরটি পেয়েছি তা এখানে:

কার্টেসিয়ান সমন্বয় ব্যবস্থায় কেবল সংজ্ঞাটি সম্পূর্ণ করতে:

  • এক্স-অক্ষটি দীর্ঘ, ল্যাট (0,0) দিয়ে যায়, সুতরাং দ্রাঘিমাংশ 0 নিরক্ষীয় অঞ্চলে মিলবে;
  • y- অক্ষটি দিয়ে যায় (0,90);
  • এবং z- অক্ষটি মেরুগুলির মধ্য দিয়ে যায়।

রূপান্তরটি হ'ল:

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

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

z = R *sin(lat)

যেখানে আর পৃথিবীর আনুমানিক ব্যাসার্ধ (যেমন 63৩71১ কিমি)।

যদি আপনার ত্রিকোণমিতিক ফাংশনগুলি রেডিয়ানগুলি আশা করে (যা তারা সম্ভবত করে) তবে আপনাকে প্রথমে আপনার দ্রাঘিমাংশ এবং অক্ষাংশকে রেডিয়ানে রূপান্তর করতে হবে। আপনার স্পষ্টতই দশমিক উপস্থাপনা দরকার, ডিগ্রি \ মিনিট \ সেকেন্ড নয় ( যেমন রূপান্তর সম্পর্কে এখানে দেখুন )।

ফিরে রূপান্তর জন্য সূত্র:

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

আসিন অবশ্যই আর্ক সাইন। উইকিপিডিয়ায় atan2 সম্পর্কে পড়ুন । রেডিয়ান থেকে ডিগ্রীতে ফিরে রূপান্তর করতে ভুলবেন না।

এই পৃষ্ঠাটি এর জন্য সি # কোড দেয় (দ্রষ্টব্য যে এটি সূত্রগুলির চেয়ে খুব আলাদা) এবং কেন এটি সঠিক তা সম্পর্কে কিছু ব্যাখ্যা এবং চমৎকার চিত্র রয়েছে,


17
-1 এটি ভুল। আপনি ধরে নিচ্ছেন যে পৃথিবীটি একটি গোলক, তবে ডাব্লুজিএস -৪৪ একটি উপবৃত্তাকার হিসাবে ধরেছে।
স্টার ব্লু

42
@ স্টারব্লিউ: আমি নিশ্চিত নই যে আপনি প্রদত্ত উত্তরটিকে "সঠিক" বা "ভুল" লেবেল দেওয়ার মতো অবস্থানে আছেন। গোলাকার আনুমানিকতা (ECEF- শৈলীর x, y, z কর্ডগুলি পেতে) উপলব্ধ ল্যাট / এলএনজি ব্যবহার করে (যা ডাব্লুজিএস -৪৪ উল্লেখ করা হয়) হয় মূল পোস্টারের প্রয়োজনের জন্য "পর্যাপ্ত" বা "পর্যাপ্ত নয়"। দূরত্ব এবং ভারবহন অনুমানের জন্য, আমি এই সহজ রূপান্তরটি ঠিকঠাক করব। তিনি যদি স্যাটেলাইট উৎক্ষেপণ করেন, তবে সম্ভবত না। সর্বোপরি, ডাব্লুজিএস -৪৪ নিজেই "ভুল" ... কারণ এটি পৃথিবীর পৃষ্ঠের নিখুঁত মডেল নয়; সমস্ত উপবৃত্তাকার মডেলগুলি আনুমানিক are খুব খারাপ ওপি আমাদের কী করতে চেষ্টা করছে তা আমাদের জানায়নি।
ড্যান এইচ

10
@ ড্যান এইচ প্রশ্নটি ডাব্লুজিএস -৪৪ এর জন্য জিজ্ঞাসা করেছে, এবং আপনি অন্য কিছু উত্তর দিলে আপনার কমপক্ষে পার্থক্য / ত্রুটি সম্পর্কে আলোচনা করা উচিত, যা এই উত্তরটি দেয় না।
স্টার ব্লু

@ ড্যাফনা-শেজাফ পিছনে রূপান্তর করতে পারবেন না ... আমি রেডিয়ান থেকে ডিগ্রীতে ফিরেও করেছি, তবে ফলাফলটি এক রকম নয় ...

আপনাকে ধন্যবাদ, এটি কাজ করে না কেন তা
বোঝার

6

কার্তেসিয়ান স্থানাঙ্কে রূপান্তর GPS(WGS84)করার তত্ত্বটি https://en.wikedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

নিম্নলিখিতটি আমি ব্যবহার করছি:

  • জিপিএসে দ্রাঘিমাংশ (WGS84) এবং কার্টেসিয়ান স্থানাঙ্কগুলি একই।
  • অক্ষাংশটি ডাব্লুজিএস ৮৮ উপবৃত্তাকার পরামিতি দ্বারা আধা-প্রধান অক্ষটি 78৩7878১13137 মি, এবং রূপান্তরিত হওয়া দরকার
  • সমতলকরণের পারস্পরিক ক্রম 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 আর্ক-মিনিটের স্থানিক রেজোলিউশনের সাহায্যে এটি করা যায়।

বা যদি আপনি কিছু মাত্রা থাকতে পেশাদারী GPS উচ্চতাজনিত হয়েছে H( MSL, গড় সমুদ্রতল উপরে হায় ) এবং UNDULATIONমধ্যকার সম্পর্ক geoidএবং ellipsoid (m)নির্বাচিত উপাত্ত আউটপুট অভ্যন্তরীণ টেবিল থেকে। তুমি পেতে পারh = H(msl) + undulation

কার্টেসিয়ান স্থানাঙ্ক দ্বারা এক্সওয়াইজেড থেকে:

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

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

z = R *sin(lat)

আর এর মান কত?
eych

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

পাইথন 3.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.wikiki.org/wiki/Geodetic_system#From_geodetic_to_ECEF দেখুন - এটি সূত্রের পাশাপাশি আপনার ডাব্লুজিএস ৮৮ কনস্ট্যান্টের রূপান্তরটির জন্য প্রয়োজন ।

সেখানকার সূত্রগুলি রেফারেন্স এলিপসয়েড পৃষ্ঠের তুলনায় উচ্চতার ক্ষেত্রেও বিবেচনা করে (আপনি যদি কোনও জিপিএস ডিভাইস থেকে উচ্চতার ডেটা পেয়ে থাকেন তবে দরকারী)।


আপনি এখানে লিঙ্কের বিষয়বস্তু পোস্ট না করলেও উত্সাহ দেওয়া।
ম্যাড পদার্থবিদ

2

ইতিমধ্যে বাস্তবায়ন এবং পরীক্ষা-প্রমাণিত হয়েছে এমন কোনও কিছু কেন বাস্তবায়ন করবেন?

এক জন্য সি # এর নেটটোপোলজি স্যুট রয়েছে যা জেটিএস টপোলজি স্যুটটির নেট নেট বন্দর।

বিশেষত, আপনার গণনায় একটি গুরুতর ত্রুটি রয়েছে। পৃথিবী একটি নিখুঁত গোলক নয়, এবং পড়তা পৃথিবীর ব্যাসার্ধ সুনির্দিষ্ট পরিমাপ জন্য এটিকে কেটে নাও হতে পারে।

যদি কিছু ক্ষেত্রে হোমব্রিউ ফাংশন ব্যবহার করা গ্রহণযোগ্য হয় তবে জিআইএস এমন একটি ক্ষেত্রের একটি ভাল উদাহরণ যেখানে এটি নির্ভরযোগ্য, পরীক্ষার মাধ্যমে প্রমাণিত লাইব্রেরি ব্যবহারের চেয়ে বেশি পছন্দ করা হয়।


1
+1 টি। একটি নির্ভরযোগ্য লাইব্রেরি ব্যবহার হোমব্রব্রু ফাংশনের চেয়ে আরও সঠিক এবং আরও সহজ
মার্কজে

5
নেটটপোলজি স্যুট কীভাবে দীর্ঘ / দেরী থেকে কার্টেশনে রূপান্তর করে?
বিনায়ান

1
এনটিএস সমন্বয় রূপান্তর ক্ষমতাগুলি অন্তর্ভুক্ত করে না, হতে পারে আপনার প্রয়োজন হবে প্রজ নেট
ডি_গুইডি

6
হাস্যকর, উত্তর এমনকি রূপান্তর ক্ষমতা প্রদান করে না।
মোটস

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
oschrenk

হুঁ ... আমি কিছুটা জন্য জেটিএসের দিকে চেয়েছি। নতুন লাইন স্ট্রিং সহ) পর্যন্ত লাইনগুলি জেটিএসের মতো দেখায়। তবে আমি জেটিএসে সিআরএস এবং ট্রান্সফর্ম স্টাফ দেখতে পাচ্ছি না। সুতরাং: তারা কি সেখানে আছে এবং আমি তাদের মিস করছি? সেখানে ছিলেন, এবং 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;


}

পরামিতি কি?
বলিমন

উচ্চতা, আপনি কীভাবে জিপিএস কীভাবে কাজ করে তা জানেন না তবে আপনি এখানে কী করছেন;)
মুশপিপাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.