অক্ষাংশ এবং দ্রাঘিমাংশ ( ডাব্লুজিএস -৪৮ ) হিসাবে দেওয়া কিছু পৃথিবী কেন্দ্রিক সমন্বিত পয়েন্ট আমার কাছে রয়েছে ।
আমি কীভাবে তাদেরকে পৃথিবীর কেন্দ্রে উত্সের সাথে কার্তেসিয়ান স্থানাঙ্কে (x, y, z) রূপান্তর করতে পারি?
অক্ষাংশ এবং দ্রাঘিমাংশ ( ডাব্লুজিএস -৪৮ ) হিসাবে দেওয়া কিছু পৃথিবী কেন্দ্রিক সমন্বিত পয়েন্ট আমার কাছে রয়েছে ।
আমি কীভাবে তাদেরকে পৃথিবীর কেন্দ্রে উত্সের সাথে কার্তেসিয়ান স্থানাঙ্কে (x, y, z) রূপান্তর করতে পারি?
উত্তর:
আমি সম্প্রতি ডাব্লুজিএস -৪৪ ডেটার উপর "হাভারসাইন ফর্মুলা" ব্যবহার করে এর অনুরূপ কিছু করেছি, যা অত্যন্ত সন্তোষজনক ফলাফল সহ "লস অফ হ্যাভারসাইনস" থেকে প্রাপ্ত iv
হ্যাঁ, ডাব্লুজিএস -৪৪ ধরে নেয় পৃথিবী একটি উপবৃত্তাকার, তবে আমি বিশ্বাস করি আপনি কেবল "হ্যাভারসাইন ফর্মুলা" এর মতো একটি পদ্ধতির ব্যবহার করে প্রায় 0.5% গড় ত্রুটি পেয়ে যা এটি আপনার ক্ষেত্রে গ্রহণযোগ্য পরিমাণ ত্রুটি হতে পারে। আপনি কয়েক ফুট দূরত্বের কথা না বললে আপনার সর্বদা কিছু পরিমাণ ত্রুটি থাকবে এবং তারপরেও পৃথিবীর তাত্ত্বিকভাবে বক্রতা রয়েছে ... আপনার যদি আরও কঠোরভাবে ডাব্লুজিএস -৪৪ সুসংগত পদ্ধতির প্রয়োজন হয় তবে "ভিনসেন্টি ফর্মুলা" চেকআউট করুন।
আমি বুঝতে পারি যে স্টারব্লু কোথা থেকে আসছে, তবে ভাল সফ্টওয়্যার ইঞ্জিনিয়ারিং প্রায়শই ট্রেড অফগুলি সম্পর্কে থাকে, তাই এটি আপনার কাজের জন্য প্রয়োজনীয় সঠিকতার উপর নির্ভর করে। উদাহরণস্বরূপ, "ম্যানহাটান দূরত্ব সূত্র" থেকে গণনা করা ফলাফল বনাম "দূরত্বের সূত্র" থেকে প্রাপ্ত ফলাফলটি কিছু পরিস্থিতিতে আরও ভাল হতে পারে কারণ এটি কম্পিউটারের চেয়ে কম ব্যয়বহুল। "কোন পয়েন্টটি সবচেয়ে নিকটে?" দৃশ্যাবলী যেখানে আপনার একটি নির্দিষ্ট দূরত্ব পরিমাপের প্রয়োজন নেই।
সম্পর্কিত, "হাভারসাইন সূত্র" এটি কার্যকর করা সহজ এবং দুর্দান্ত কারণ এটি দ্বি-মাত্রিক ত্রিকোণমিতির উপর ভিত্তি করে "লস অফ কোসাইন" ভিত্তিক পদ্ধতির পরিবর্তে "স্পেরিকাল ট্রাইগনোমেট্রি" ব্যবহার করে, সুতরাং আপনি নির্ভুলতার একটি সুন্দর ভারসাম্য পেয়েছেন জটিলতা বেশি
ক্রিস ভেনেস নামে এক ভদ্রলোকের http://www.movable-type.co.uk/scriptts/latlong.html এ একটি দুর্দান্ত ওয়েবসাইট রয়েছে যা আপনার আগ্রহী কিছু ধারণাগুলি ব্যাখ্যা করে এবং বিভিন্ন প্রোগ্রামিক বাস্তবায়নের চিত্র প্রদর্শন করে; এটির পাশাপাশি আপনার এক্স / ওয়াই রূপান্তর প্রশ্নেরও উত্তর দেওয়া উচিত।
আমি যে উত্তরটি পেয়েছি তা এখানে:
কার্টেসিয়ান সমন্বয় ব্যবস্থায় কেবল সংজ্ঞাটি সম্পূর্ণ করতে:
রূপান্তরটি হ'ল:
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 সম্পর্কে পড়ুন । রেডিয়ান থেকে ডিগ্রীতে ফিরে রূপান্তর করতে ভুলবেন না।
এই পৃষ্ঠাটি এর জন্য সি # কোড দেয় (দ্রষ্টব্য যে এটি সূত্রগুলির চেয়ে খুব আলাদা) এবং কেন এটি সঠিক তা সম্পর্কে কিছু ব্যাখ্যা এবং চমৎকার চিত্র রয়েছে,
কার্তেসিয়ান স্থানাঙ্কে রূপান্তর GPS(WGS84)
করার তত্ত্বটি https://en.wikedia.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
উচ্চতাজনিত হয়েছে 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)
Proj.4 সফ্টওয়্যার একটি কমান্ড লাইন প্রোগ্রাম যা রূপান্তর করতে পারেন, যেমন উপলব্ধ
LAT=40
LON=-110
echo $LON $LAT | cs2cs +proj=latlong +datum=WGS84 +to +proj=geocent +datum=WGS84
এটি একটি সিআইপিও সরবরাহ করে । বিশেষত, ফাংশনটি pj_geodetic_to_geocentric
প্রথমে কোনও প্রজেকশন অবজেক্ট সেট আপ না করে রূপান্তরটি করবে।
পাইথন 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
আপনি যদি কোনও গোলকের পরিবর্তে এলিপসয়েডের ভিত্তিতে স্থানাঙ্কগুলি পাওয়ার বিষয়ে চিন্তা করেন তবে http://en.wikiki.org/wiki/Geodetic_system#From_geodetic_to_ECEF দেখুন - এটি সূত্রের পাশাপাশি আপনার ডাব্লুজিএস ৮৮ কনস্ট্যান্টের রূপান্তরটির জন্য প্রয়োজন ।
সেখানকার সূত্রগুলি রেফারেন্স এলিপসয়েড পৃষ্ঠের তুলনায় উচ্চতার ক্ষেত্রেও বিবেচনা করে (আপনি যদি কোনও জিপিএস ডিভাইস থেকে উচ্চতার ডেটা পেয়ে থাকেন তবে দরকারী)।
ইতিমধ্যে বাস্তবায়ন এবং পরীক্ষা-প্রমাণিত হয়েছে এমন কোনও কিছু কেন বাস্তবায়ন করবেন?
এক জন্য সি # এর নেটটোপোলজি স্যুট রয়েছে যা জেটিএস টপোলজি স্যুটটির নেট নেট বন্দর।
বিশেষত, আপনার গণনায় একটি গুরুতর ত্রুটি রয়েছে। পৃথিবী একটি নিখুঁত গোলক নয়, এবং পড়তা পৃথিবীর ব্যাসার্ধ সুনির্দিষ্ট পরিমাপ জন্য এটিকে কেটে নাও হতে পারে।
যদি কিছু ক্ষেত্রে হোমব্রিউ ফাংশন ব্যবহার করা গ্রহণযোগ্য হয় তবে জিআইএস এমন একটি ক্ষেত্রের একটি ভাল উদাহরণ যেখানে এটি নির্ভরযোগ্য, পরীক্ষার মাধ্যমে প্রমাণিত লাইব্রেরি ব্যবহারের চেয়ে বেশি পছন্দ করা হয়।
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;
}