Конвертировать лат / лонг в JTS? - PullRequest
19 голосов
/ 06 декабря 2011

Я пытаюсь интегрировать спящий пространственный с JPA для поисков Geo.Я ссылаюсь на учебник на официальном сайте (я не связан с hibernatespatial).

Учебное пособие, к сожалению, не охватывает, как создать экземпляр Point из пары широта / долгота.Я пытаюсь сделать это здесь, но я все еще не уверен, является ли это правильным способом преобразования пары широта / долгота в экземпляр точки JTS:

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.hibernate.annotations.Type;
import javax.persistence.*;

@Entity
public class Location {

    private Double latitude;

    private Double longitude;

    @Type(type = "org.hibernatespatial.GeometryUserType")
    private Point coordinates;

    private final GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);

    @PrePersist
    @PreUpdate
    public void updateCoordinate() {
        if (this.latitude == null || this.longitude == null) {
            this.coordinates = null;
        } else {
            this.coordinates = geometryFactory.createPoint(new Coordinate(latitude, longitude));
        }
    }

    public Double getLatitude() {
        return latitude;
    }

    public void setLatitude(Double latitude) {
        this.latitude = latitude;
    }

    public Double getLongitude() {
        return longitude;
    }

    public void setLongitude(Double longitude) {
        this.longitude = longitude;
    }
}

Ответы [ 4 ]

25 голосов
/ 08 декабря 2011

JTS не волнует, какие единицы вашей точки или системы координат.

Однако предполагает, что координаты находятся на декартовой плоскости , поэтому некоторые геометрические операции, такие как вычисления расстояния, могут быть неточными на больших расстояниях. (Они еще не поддерживают геодезические расчеты.)

Это хорошо для простого хранения.

Однако, важно отметить, что долгота - это значение X, а широта - это значение Y. Поэтому мы говорим «широта / долгота», но JTS будет ожидать это в порядке «долгота / широта». Так что вы должны использовать geometryFactory.createPoint(new Coordinate(longitude, latitude))

2 голосов
/ 22 июня 2016

Подводя итог тому, что говорили другие, при преобразовании в Координату нужно учесть 3 основных момента:

  • Проекция. JTS работает в декартовой плоскости, поэтому всеискажение от, например, Mercator распространяется на ваш расчет.Таким образом, вы должны использовать его только на довольно коротких дистанциях.Я не уверен в точной величине, но я думаю, что все ниже степени расширения должно быть в порядке.Оставайтесь ниже 0,1 градуса, и вы определенно будете в безопасности.
  • Единицы. Вы можете поместить абсолютно любую единицу в JTS.Проблема в том, что вы не можете сказать JTS, используете ли вы метры, градусы или что-то еще.Поэтому вы должны позаботиться о том, чтобы вы либо придерживались одной единицы, либо конвертировали, где это необходимо.
  • Стандарт. Стандарт ISO гласит, что геопространственные координаты предоставляются в первую очередь.Тем не менее, он конкурирует со стандартами GeoJSON / WKT, которые в первую очередь указаны, так что наоборот.Обе стандартные группы придерживаются приложений (например, Apache Lucene переключал стандарты между выпусками без изменения сигнатуры метода, вызывая головные боли у сотен пользователей, задающихся вопросом, почему их карты внезапно перевернулись), и JTS удерживает GeoJSON/ WKT версия.Обратите внимание на то, что куда бы вы ни передавали данные из другой библиотеки - это может следовать GeoJSON и WKT, или ISO, вы должны сообщить об этом заранее.(Поверьте мне. У меня уже были проблемы с этим, и это может быть действительно раздражающим, когда вы просматриваете весь код и меняете порядок.)

Итак, нет, это не так.Вы прямо входите в третью проблему.Сначала JTS.

Кроме того, вы можете рассмотреть возможность использования Neo4j Spatial вместо режима гибернации.Он использует скорость запроса графиков Neo4j и имеет встроенную поддержку JTS.Он также имеет один из самых удобных Java API среди всех IMHO.

1 голос
/ 12 июля 2013

Вот как создать координату в WGS-84:

    double EARTH_RADIUS = 6378137.0;
    double x = longitude * EARTH_RADIUS * Math.PI / 180.;
    double y = EARTH_RADIUS * Math.sin(Math.toRadians(latitude));
    return new Coordinate(x,y,0.);

Cheers

0 голосов
/ 14 июня 2013

У меня была та же проблема, и я перевел координаты из широты / долготы в UTM (см. http://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system).

. В основном вы конвертируете из широты / долготы в пару (X, Y), но интересным фактом является то, что эти X и Y являются реальными метрами, поэтому вы можете делать точные вычисления, которые зависят от расстояния (на самом деле вы должны учитывать небольшое искажение, но незначительное, когда говорите о точности шкалы метра).

Меня не очень порадовали функции LatLong2UTM, предоставляемые существующими Java-фреймворками, поэтому я выкатил свою собственную. Я без проблем перенес одну из некоторых онлайн-конвертеров javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...