【问题标题】:Hibernate Spatial Create Geometry object休眠空间创建几何对象
【发布时间】:2017-06-05 01:08:39
【问题描述】:

我正在用 Java 开发一个带有 oracle 空间的定位应用程序。我正在使用休眠 4.0 空间作为 orm 层。我是空间新手,我找不到休眠空间的最佳实践。我的数据库模型如下;

CREATE TABLE SYSTEM.POI  (
    POI_ID          INTEGER,
    SERVICE_ID      INTEGER,
    POI_NAME        VARCHAR2(255 CHAR),
    DESCRIPTION     VARCHAR2(1023 CHAR),
    CATEGORY        VARCHAR2(127 CHAR),
    ADDRESS         VARCHAR2(4000 CHAR),
    MOBILE_PHONE    VARCHAR2(15 CHAR),
    FIXED_PHONE     VARCHAR2(15 CHAR),
    BUSINESS_HOURS  VARCHAR2(1023 CHAR),
    SHAPE           SDO_GEOMETRY  
)

插入语句如下;

INSERT INTO SYSTEM.POI (SERVICE_ID, POI_NAME, DESCRIPTION, CATEGORY, ADDRESS, MOBILE_PHONE, FIXED_PHONE, BUSINESS_HOURS, SHAPE)
VALUES(
        '1320',
        'PO-Kral Petrol Ürünleri San ve Tic. Ltd. şti.',
        'Camilerimiz',
        'CAMI',
        'İSLİCE MAHALLESİ DERE SOKAK NO:5',
        '2762151093',
        '5552552343',
        'Hafta içi  09:00 - 17:00, haftasonu 09:00 - 13:00 açık',
        SDO_GEOMETRY(
            2001, 
            3785,
            SDO_POINT_TYPE(28.90762, 41.1521, NULL),
            NULL,
            NULL
        )
      );  

实体模型跟随我正在共享的只是 sdo_geometry 对象;

import com.vividsolutions.jts.geom.Geometry;

...

    @Column(name="SHAPE")
    @Type(type = "org.hibernatespatial.GeometryUserType")
    private Geometry shape;

    public Geometry getShape() {
      return shape;
    }

    public void setShape(Geometry shape) {
      this.shape = shape;
    }

如何用动态参数填充这个 spahe 对象。例如;

  SDO_GEOMETRY(
                2001,  --> sdo_gtype
                3785,  --> sdo_srid
                SDO_POINT_TYPE(28.90762, 41.1521, NULL),  --> sdo_point
                NULL,  --> sdo_elem_info
                NULL   --> sdo_ordinates
            )

如何动态传递sdo_gtype,sdo_srid,sdo_point_type参数给几何对象?

【问题讨论】:

  • 不是一个答案,只是我想指出的一点:您的 SRID 设置为 3785。这是全球球形墨卡托投影(由 Google 使用)。但是您的坐标看起来像 WGS84 long/lat。正确的 SRID 是 4326。
  • 是的,你是对的,我的失败 3785。我将其更改为 8307 为 long/lat wgs84

标签: java hibernate oracle-spatial hibernate-spatial


【解决方案1】:

你可以如下图创建。

com.vividsolutions.jts.geom.Point p = new GeometryFactory().createPoint(new Coordinate(12.34343, 12.232424));
System.out.println(p);

GeonmetryFactory 构造函数中,您可以传递精度模型、srid 和 CoordinateReferenceSystem。

但是,JTS 周围有一个名为 geolatte 的空间包装器,它随 Hibernate Spatial 一起提供(在 maven 中自动下载 jars)。您可以使用Geolatte 创建Point,如下所示。

        org.geolatte.geom.Point<G2D> point = Geometries.mkPoint(new G2D(12.34343, 12.232424), CoordinateReferenceSystems.WGS84);
        System.out.println(point);

有一些实用程序类可以从JTS 转换为Geolatte,反之亦然。并附上程序的输出。

        org.geolatte.geom.Point<G2D> point = Geometries.mkPoint(new G2D(12.34343, 12.232424), CoordinateReferenceSystems.WGS84);
        System.out.println(point);
        com.vividsolutions.jts.geom.Point p = new GeometryFactory(new PrecisionModel(), 4326).createPoint(new Coordinate(12.34343, 12.232424));
        System.out.println(p);
        System.out.println(JTS.to(point));
        System.out.println(JTS.from(p));

输出:

SRID=4326;POINT(12.34343 12.232424)
POINT (12.34343 12.232424)
POINT (12.34343 12.232424)
SRID=4326;POINT(12.34343 12.232424)

更新

Geolatte支持你要找的投影,hereGeolatte支持的SRID,由于你使用的是Project CS,所以需要使用C2D(Cartesian 2D)

这是创建的代码示例

        System.out.println(CrsRegistry.getProjectedCoordinateReferenceSystemForEPSG(3785).getName());
        org.geolatte.geom.Point<C2D> point1 = Geometries.mkPoint(new C2D(12.34343, 12.232424), CrsRegistry.getProjectedCoordinateReferenceSystemForEPSG(3785));
        System.out.println(point1);

输出:

Popular Visualisation CRS / Mercator (deprecated)
SRID=3785;POINT(12.34343 12.232424)

【讨论】:

  • 谢谢你的回答,我试过了,但你的 srid 和我的不同。我正在使用 3785 srid。我在 CoordinateReferenceSystems 中找不到这个 srid 有这个 srid 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
相关资源
最近更新 更多