كيفية تحويل خط العرض خط الطول أو إلى متر ؟

StackOverflow https://stackoverflow.com/questions/639695

  •  11-07-2019
  •  | 
  •  

سؤال

إذا كان لدي خط العرض خط الطول أو القراءة في مستوى NMEA الشكل هل هناك طريقة سهلة / صيغة لتحويل أن القراءة متر ، والتي لا يمكن تنفيذ ذلك في جافا (J9)?

تحرير:حسنا يبدو ما أريد القيام به هو غير ممكن بسهولة, ومع ذلك ما كنت حقا تريد القيام به هو:

قلت اللات طويلة من وسيلة نقطة و اللات و طويلة المستخدم هل هناك طريقة سهلة مقارنة تقرر متى تخبر المستخدم في معقول قريبة من الطريق النقطة ؟ أدرك معقول هو الموضوع ولكن هل هذا القيام بذلك بسهولة قادرة أو لا تزال مفرطة في الرياضيات ؟

هل كانت مفيدة؟

المحلول

وهنا هي وظيفة جافا سكريبت:

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

شرح: https://en.wikipedia.org/wiki/Haversine_formula

<اقتباس فقرة>   

والصيغة haversine يحدد مسافة الدائرة العظمى بين نقطتين على المجال نظرا خطوط الطول وخطوط العرض الخاصة.

نصائح أخرى

ونظرا كنت تبحث عن صيغة بسيطة، وربما هذا هو أبسط طريقة للقيام بذلك، على افتراض أن الأرض هي المجال المحيط 40075 كيلومترا.

وطول بالأمتار من 1 درجة من خط العرض = دائما 111.32 كم

وطول بالأمتار من 1 درجة من خط الطول = 40075 كم * كوس (العرض) / 360

لتقريب المسافات القصيرة بين الإحداثيات اثنين اعتدت الصيغ من   http://en.wikipedia.org/wiki/Lat-lon :

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

في التعليمات البرمجية أدناه لقد تركت الأرقام الأولية لإظهار علاقتها الصيغة من ويكيبيديا.

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

وجاء في موسوعة ويكيبيديا أن calcs المسافة ضمن 0.6M ل100KM طوليا و1CM ل100KM خطوط العرض ولكنني لم يتم التحقق هذا في أي مكان بالقرب من هذا دقة على ما يرام لاستخدامي.

خطوط العرض وخطوط الطول تحديد نقاط ، ليس المسافات ، لذلك سؤالك لا معنى لها إلى حد ما.إذا كنت تسأل عن أقصر مسافة بين اثنين (اللات, lon) نقطة ، انظر هذه مقالة ويكيبيديا على الدائرة العظمى المسافات.

والأرض هي سطح غير منتظم بشكل مزعج، لذلك ليس هناك صيغة بسيطة للقيام بذلك بالضبط. عليك أن تعيش مع نموذج تقريبي من الأرض، والمشروع الإحداثيات على ذلك. نموذج I عادة انظر المستخدمة لهذا هو WGS 84 . هذا ما أجهزة تحديد المواقع وعادة ما يستخدم لحل نفس المشكلة بالضبط.

وNOAA لديها بعض البرامج التي يمكن تنزيلها للمساعدة في هذا على موقعه على الانترنت .

وهناك العديد من الأدوات التي من شأنها جعل هذا سهلا. انظر monjardin في الإجابة للحصول على مزيد من التفاصيل حول ما هو المشاركة.

ومع ذلك، القيام بذلك ليس من الصعب بالضرورة. هذا يبدو وكأنه كنت تستخدم جافا، لذلك أود أن أوصي تبحث في شيء من هذا القبيل GDAL . ويوفر مغلفة جافا لروتين حياتهم، وأنهم جميع الأدوات اللازمة لتحويل من خطوط الطول / العرض (الإحداثيات الجغرافية) لUTM (المتوقع نظام الإحداثيات) أو بعض الدول الأخرى معقول خريطة الإسقاط.

وUTM هو لطيف، لأنه متر، من السهل جدا للعمل مع. ومع ذلك، سوف تحتاج إلى الحصول على منطقة UTM للحصول على أن القيام بعمل جيد . هناك بعض الرموز البسيطة المتاحة عبر غوغلينغ للعثور على المنطقة المناسبة لزوج خطوط الطول / العرض.

وهنا هو إصدار R من ب-ح-في وظيفة ، فقط في حالة:

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}

ويعرف واحدة ميل بحري (1852 متر) واحدة arcminute من الطول عند خط الاستواء . ومع ذلك، تحتاج إلى تحديد إسقاط الخريطة (وانظر أيضا <لأ href = "HTTP: / /en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system "يختلط =" نوفولو noreferrer "> UTM ) التي كنت تعمل لتحويل لجعل حقا معنى.

وهناك عدد غير قليل من الطرق لحساب هذا. كل منهم استخدام aproximations علم المثلثات الكروية حيث نصف قطرها هو واحد من الأرض.

http://www.movable-type.co.uk/ مخطوطات / latlong.html قليلا من الأساليب والتعليمات البرمجية في لغات مختلفة.

على أساس متوسط المسافة درجة في الأرض.

1° = 111km;

تحويل هذا التقدير الدائري و الفاصل عن متر ، واتخاذ هو الرقم السحري من أجل راد في متر:0.000008998719243599958;

ثم:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function

لتحويل خطوط الطول والعرض في x و y التمثيل عليك أن تقرر ما هو نوع من إسقاط الخريطة للاستخدام. أما بالنسبة لي، البيضاوي مركاتور يبدو جيدا جدا. هنا يمكنك العثور على التنفيذ (في جافا جدا).

إذا نهايتها بما فيه الكفاية يمكن أن تفلت من التعامل معها بوصفها تنسق على متن طائرة مسطحة. يعمل هذا على القول، الشارع أو مستوى المدينة إذا الكمال دقة يكون لا يتطلب وجميع ما تحتاجه هو تخمين الخام على المسافة المعنية للمقارنة مع حدا التعسفي.

إذا كنت ترغب في حل بسيط ثم استخدام Haversine صيغة كما حددها تعليقات أخرى . إذا كان لديك تطبيق حساسة دقة نأخذ في الاعتبار الصيغة Haversine لا يضمن دقة أفضل ثم 0.5٪ كما هو افتراض أن الأرض هي دائرة. لنعتبر أن الأرض هي كروي مفلطح النظر في استخدام Vincenty في . بالإضافة إلى ذلك، وأنا لست متأكدا ما نصف قطرها يجب أن نستخدمها مع الصيغة Haversine: {خط الاستواء: 6،378.137 كم، القطبية: 6،356.752 كم، الحجمي: 6،371.0088 كم}.

تحتاج إلى تحويل الاحداثيات الى راديان إلى القيام الهندسة الكروية.تحويل مرة واحدة, ثم يمكنك حساب المسافة بين نقطتين.المسافة ثم يمكن تحويلها إلى أي تدبير تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top