سؤال

البحث عن بعض نماذج التعليمات البرمجية لتحويل نقطة في نظام الإحداثيات WGS84 إلى موضع خريطة في خرائط Google (موضع البكسل)، كما يدعم أيضًا مستويات التكبير/التصغير.

إذا تم التعليق على الرموز بشكل جيد، فمن الممكن أيضًا أن تكون بلغة أخرى.

يمكنك أيضًا توجيهي إلى مشروع Java مفتوح المصدر :)

تم العثور على بعض الموارد:

طبقة مفتوحة تطبيق.

جوسم مشروع

ممتاز مكتبة إسقاط خرائط جافا من مختبرات JH.هذا منفذ جافا PROJ.4 خالص.هل الإسقاط من WGS84 إلى متر.من هناك، يكون من السهل جدًا تحويل العدادات إلى وحدات بكسل متجانبة.

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

المحلول

رمز الأداة المساعدة للبلاط في Java على موقع Mapki.com (مصدر رائع لمطوري خرائط جوجل)

نصائح أخرى

فيما يلي الوظائف في JavaSCript ...كما تم استخراجه من OpenLayers

function toMercator (lon, lat) {
  var x = lon * 20037508.34 / 180;
  var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
  y = y * 20037508.34 / 180;

  return [x, y];
  }

function inverseMercator (x, y) {
  var lon = (x / 20037508.34) * 180;
  var lat = (y / 20037508.34) * 180;

  lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

  return [lon, lat];
  }

من السهل جدًا التحويل إلى Java

أدوات جغرافية يحتوي على رمز للتحويل من وإلى أي نظام إحداثيات يمكنك تخيله، ومن بينها أيضًا خرائط Google.كما أنها مفتوحة المصدر.ومع ذلك، تجدر الإشارة أيضًا إلى أن GeoTools عبارة عن أداة كبير المكتبة، لذلك إذا كنت تبحث عن شيء صغير وسريع وسهل، فمن المحتمل ألا يكون هذا هو الحل الأمثل.

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

إذا كنت تستخدم GeoTools أو شيئًا مشابهًا، فقد تكون مهتمًا أيضًا بمعرفة أن نظام إحداثيات خرائط Google يسمى EPSG 3785.

لقد قمت بنقل هذا إلى PHP - وإليك الكود، إذا كان أي شخص يحتاج إليه:

إلى مركاتور:

$lon = ($lon * 20037508.34) / 180;
$lat = log(tan((90 + $lat) * M_PI / 360)) / (M_PI / 180);
$lat = $lat * 20037508.34 / 180;

من مركاتور:

$lon = ($lon / 20037508.34) * 180;
$lat = ($lat / 20037508.34) * 180;
$lat = 180/M_PI * (2 * atan(exp($lat * M_PI / 180)) - M_PI / 2);
/*
 * Utility functions to transform between wgs84 and google projection coordinates
 * Derived from openmap http://openmap.bbn.com/
 */

public class MercatorTransform {
    public final static double NORTH_POLE = 90.0;
    public final static double SOUTH_POLE = -NORTH_POLE;
    public final static double DATELINE = 180.0;
    public final static double LON_RANGE = 360.0;

    final public static transient double wgs84_earthEquatorialRadiusMeters_D = 6378137.0;
    private static double latfac = wgs84_earthEquatorialRadiusMeters_D;
    private static double lonfac = wgs84_earthEquatorialRadiusMeters_D;

    final public static transient double HALF_PI_D = Math.PI / 2.0d;

    /**
     * Returns google projection coordinates from wgs84 lat,long coordinates
     */
    public static double[] forward(double lat, double lon) {

        lat = normalizeLatitude(lat);
        lon = wrapLongitude(lon);

        double latrad = Math.toRadians(lat);
        double lonrad = Math.toRadians(lon);

        double lat_m = latfac * Math.log(Math.tan(((latrad + HALF_PI_D) / 2d)));
        double lon_m = lonfac * lonrad;

        double[] x = { lon_m, lat_m };
        return x;
    }

    /**
     * Returns wgs84 lat,long coordinates from google projection coordinates
     */
    public static float[] inverse(float lon_m, float lat_m) {
        double latrad = (2d * Math.atan(Math.exp(lat_m / latfac))) - HALF_PI_D;
        double lonrad = lon_m / lonfac;

        double lat = Math.toDegrees(latrad);
        double lon = Math.toDegrees(lonrad);

        lat = normalizeLatitude(lat);
        lon = wrapLongitude(lon);
        float[] x = { (float) lat, (float) lon };

        return x;
    }

    private static double wrapLongitude(double lon) {
        if ((lon < -DATELINE) || (lon > DATELINE)) {
            lon += DATELINE;
            lon = lon % LON_RANGE;
            lon = (lon < 0) ? DATELINE + lon : -DATELINE + lon;
        }
        return lon;
    }

    private static double normalizeLatitude(double lat) {
        if (lat > NORTH_POLE) {
            lat = NORTH_POLE;
        }
        if (lat < SOUTH_POLE) {
            lat = SOUTH_POLE;
        }
        return lat;
    }

}

أخذ شخص ما رمز جافا سكريبت من خرائط Google وقام بنقله إلى لغة بايثون: gmerc.py

لقد استخدمت هذا ويعمل بشكل رائع.

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