خوارزمية جغرافية للعثور على إحداثيات النقطة من موقع معروف بالمسافة والاتجاه

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

  •  22-08-2019
  •  | 
  •  

سؤال

أرغب في استخدام واجهة برمجة التطبيقات الثابتة لخرائط Google لعرض خريطة مع تراكب مسار يشير إلى الحدود.

AFAICT لا تدعم واجهة برمجة التطبيقات الثابتة المضلعات، لذا أنوي التحايل على ذلك عن طريق رسم الحدود باستخدام المسارات.

للقيام بذلك، أحتاج إلى تحديد النقاط التي يجب رسم الخطوط المستقيمة (المسارات) بينها؛لذلك أريد خوارزمية تُرجع الموقع الجغرافي (أيإحداثيات WGS84) اتجاه معين ومسافة من نقطة معروفة.

يمكن لأي شخص أن يشير لي إلى مثل هذه الخوارزمية.ويفضل أن يكون ذلك في C#، ولكن اللغات الأخرى مقبولة؟

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

المحلول 5

وجدت هذا (هنا: http://williams.best.vwh.net/avform.htm#LL):

النقطة {lat,lon} هي المسافة d على نصف القطر tc من النقطة 1 إذا:

lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
ENDIF

هل سيكون الشعاعي بالراديان أم بالدرجات؟

يحرر:

راديان = درجة * PI / 180

نصائح أخرى

وأنا تنفيذها واختبارها في C #، وذلك باستخدام الدرجات كما الإدخال / الإخراج بدلا من راديان:

    static readonly double FullCircleDegrees = 360d;
    static readonly double HalfCircleDegrees = FullCircleDegrees / 2d;
    static readonly double DegreesToRadians = Math.PI / HalfCircleDegrees;
    static readonly double RadiansToDegrees = 1 / DegreesToRadians;

    public LatLng GetPointGivenRadialAndDistance(LatLng center, double radius, double azimuth)
    {
        var lat1 = center.Lat * DegreesToRadians;
        var lng1 = center.Lng * DegreesToRadians;
        var lat = Math.Asin( (Math.Sin(lat1) * Math.Cos(radius)) + Math.Cos(lat1) * Math.Sin(radius) * Math.Cos(azimuth * DegreesToRadians));
        var lng = 0d;
        if (Math.Cos(lat) == 0)
        {
            lng = lng1;
        }
        else
        {
            lng = ((lng1 + Math.PI - Math.Asin(Math.Sin(azimuth * DegreesToRadians) * Math.Sin(radius) / Math.Cos(lat1))) % (2 * Math.PI)) - Math.PI;
        }
        return new LatLng(lat * RadiansToDegrees, lng * RadiansToDegrees);
    }

ويمكنك رسم مضلع على ملف KML، ثم تظهر KML على خرائط جوجل.

<وأ href = "http://maps.google.com/maps؟f=q&hl=en&q=http٪3A٪2F٪2Fkmlscribe.googlepages.com٪2FSamplesInMaps.kml&ie=UTF8&ll=36.879621،-53.4375&spn= 103.772916،208.476563 وض = 2 & أوم = 1 "يختلط =" نوفولو noreferrer "> هنا KML على خرائط جوجل (من عينات جوجل KML) مراجعة " الحرم الجامعي جوجل - المضلعات " القسم في المحتوى .

في (على ما أظن) كل لغة وأنا أعلم، راديان. لاحظ أن أعتقد رمز المثال الخاص بك مما يتيح لك على التنسيق على أساس المجال، وليس على WGS84. وهنا جافا البرمجية لتحويل بين أنظمة تنسق .

scroll top