Java-код для WGS84 в Google Map и обратно

Поиск примера кода для преобразования точки в системе координат WGS84 в позицию на карте в Google Maps (положение в пикселях), также поддерживающую уровни масштабирования.

Если коды хорошо прокомментированы, то это также может быть на другом языке.

Вы также можете указать мне на проект Java с открытым исходным кодом :)

Найдены некоторые ресурсы:

Реализация OpenLayer .

Проект JOSM

Отличная библиотека проекций карт Java от JH LABS. Это чистый порт Java PROJ.4. Делает проекцию от WGS84 до метров. Оттуда довольно просто преобразовать метры в пиксели плитки.

11.08.2008 10:23:48
6 ОТВЕТОВ
РЕШЕНИЕ

Код утилиты Tile на Java на mapki.com (отличный ресурс для разработчиков карт Google)

4
29.04.2015 01:06:15
Я нашел это с помощью машины обратного хода: web.archive.org/web/20110809084551/http://mapki.com/wiki/…
Arthur Dent 5.03.2013 15:50:34

Кто-то взял код JavaScript из Google Maps и портировал его на python: gmerc.py

Я использовал это, и это прекрасно работает.

0
11.08.2008 10:58:11

GeoTools имеет код для преобразования в любую систему координат, которую вы только можете себе представить, и из нее, а также из Google Map. Это также с открытым исходным кодом. Тем не менее, следует также отметить, что GeoTools - это большая библиотека, поэтому, если вы ищете что-то маленькое, быстрое и простое, скорее всего, это не тот путь.

Я очень рекомендую это, хотя, если вы собираетесь делать другие преобразования ГИС / координат и т.д., а также.

Если вы используете GeoTools или что-то подобное, вам также может быть интересно узнать, что система координат Google Map называется EPSG 3785.

3
11.08.2008 11:29:18

Вот функции в 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

4
3.03.2010 17:58:56

Я перенес это на 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);
2
8.11.2011 14:18:44
/*
 * 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;
    }

}
1
31.07.2012 19:10:39
Я видел некоторые формулы для перевода формы WGS84 в EPSG 3785, и они также спрашивают о полушарии и часовом поясе (меридиане)?
Juan Diego 6.06.2013 02:49:34
Это не работает, например, double [] c = MercatorTransform.forward (558832.516608631,180065.50201851176); возвращается: 7291651.346660811 2.3810769326496765E8
Jeryl Cook 11.10.2017 14:55:21