首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否将经纬度/经度转换为JTS?

是否将经纬度/经度转换为JTS?
EN

Stack Overflow用户
提问于 2011-12-07 01:25:29
回答 5查看 20.5K关注 0票数 24

我正在尝试集成hibernate spatial和JPA来进行地理搜索。我一直在引用官方网站上的tutorial (我与hibernatespatial没有关联)。

不幸的是,本教程没有介绍如何从纬度/经度对创建Point实例。我正在尝试这样做,但我仍然不确定这是否是将纬度/经度对转换为JTS Point实例的正确方法:

代码语言:javascript
复制
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;
    }
}
EN

回答 5

Stack Overflow用户

发布于 2011-12-08 22:59:31

JTS不关心你的点的单位或坐标系是什么。

但是,由于it does assume that the coordinates are on a Cartesian plane,因此某些几何图形操作(如距离计算)在长距离上可能不准确。(它们还不支持大地测量计算。)

它应该可以用于简单的存储用途。

但是,需要注意的重要一点是,经度是X值,纬度是Y值。所以我们说"lat/long",但JTS期望它的顺序是"long/lat“。所以你应该使用geometryFactory.createPoint(new Coordinate(longitude, latitude))

票数 30
EN

Stack Overflow用户

发布于 2016-06-22 23:42:18

综上所述,在转换到坐标时,需要注意3件主要的事情:

墨卡托JTS在笛卡尔平面上工作,因此所有来自

  • Projection.的失真都会传播到您的计算中。因此,您应该只在相当短的范围内使用它。我不确定确切的规模,但我认为任何低于一定程度的扩张都应该没问题。保持在0.1度以下,你肯定是在安全的side.
  • Units.上,你可以完美地将任何单位放入JTS中。问题是您不能告诉JTS您使用的是米、度还是其他任何东西。因此,您必须小心,要么坚持使用一个单位,要么在necessary.
  • Standard.标准规定的地理空间坐标稍后提供的任何地方进行转换。然而,它与GeoJSON/WKT标准竞争,这两个标准都是lon优先的,所以相反。两个标准组都有自己的应用程序(例如,Apache Lucene在不同版本之间切换标准,但没有更改方法签名,因此让数百名用户感到头疼,他们想知道为什么他们的地图突然被翻转了),而JTS则保留了GeoJSON/WKT版本。请注意,无论您在何处传递来自另一个库的数据,它都可能遵循GeoJSON和WKT,或者ISO,您应该提前通知自己。(相信我。我已经在这方面遇到了麻烦,而且遍历整个代码并颠倒顺序可能真的很烦人。)

所以,不,这是不对的。你直接走进了第三个问题。JTS是lon first。

此外,您可以考虑使用Neo4j Spatial而不是hibernate。它利用了Neo4j的图形查询速度,并具有内置的JTS支持。它还拥有与IMHO相关的最舒适的Java API之一。

票数 3
EN

Stack Overflow用户

发布于 2013-07-12 15:47:04

以下是如何在WGS-84中创建坐标:

代码语言:javascript
复制
    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.);

干杯

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8404090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档