【问题标题】:Problems with dealing with Geometry end WKBwriter on JTSJTS 上处理 Geometry 端 WKBwriter 的问题
【发布时间】:2011-09-01 21:14:45
【问题描述】:

我刚刚开始使用几何图形,但遇到了一些非常奇怪的错误。我正在尝试在我的 java 代码中创建一个具有特定 SRID 的 WKB。

我已经完成了:

GeometryFactory gm = new GeometryFactory(new PrecisionModel,4326)
WKBWriter w = new WKBWriter(2,ByteOrderValues.LITTLE_ENDIAN)

Geometry geom: Geometry = gm.createPoint(new Coordinate(4,5))
Array[Byte] the_geom = w.write(geom)

println(geom)
println(geom.getSRID)
println(WKBWriter.toHex(the_geom.get))

获得

POINT (4 5)
4326
010100000000000000000010400000000000001440

但是在我的数据库中使用 postgis:

GEOMETRYFROMTEXT('Point(4 5)',4326)) 

结果

0101000020E610000000000000000010400000000000001440

我在这里做错了什么??

【问题讨论】:

    标签: java geometry postgis jts


    【解决方案1】:

    当存在 SRID 时,PostGIS 不(仅)使用 WKB 标准,它使用支持 3d 和 SRID 的 EWKB 格式,而 WKB specification 不使用。将 WKB 视为一种轻量级的二进制二维数组,它是一种非常简单的格式。它不包括二进制表示中的高程或 SRID,在 OGC 标准空间参考系统中是元数据。以下是一些可能有助于了解您如何使用 WKB 和 EWKB 的交互类型:

    moveable=> insert into my_table (some_other_geom) values (GeomFromText('POINT(4 5)'));
    moveable=> insert into my_table (some_other_geom) values (GeomFromText('POINT(4 5)', 4326));
    

    这给了你:

    010100000000000000000010400000000000001440
    0101000020E610000000000000000010400000000000001440
    

    如你所见。如果您从一个十六进制值开始并想要添加 SRID 投影并存储为 EWKB,您可以执行以下变体:

    ==>insert into my_table (some_other_geom) values (ST_GeomFromWKB(decode('010100000000000000000010400000000000001440', 'hex'), 4326));
    INSERT 0 1
    

    或:

    moveable=> insert into my_table (some_other_geom) values (ST_GeomFromWKB(decode('010100000000000000000010400000000000001440', 'hex')));
    INSERT 0 1
    

    正如您所期望的那样,这些收益分别为:

    0101000020E610000000000000000010400000000000001440
    010100000000000000000010400000000000001440
    

    其中 null -1 默认 SRID 与非 SRID 2d WKB 格式相同。总的来说,我认为使用 WKT、GeoJSON 和 KML 更安全,因为它们也是 OGC(?)1 开放标准,并且 SQL 版本有一些需要的更新待办的。正如 PostGIS 文档所建议的那样:“PostGIS 扩展格式目前是 OGC 的超集(每个有效的 WKB/WKT 都是有效的 EWKB/EWKT),但这在未来可能会有所不同,特别是如果 OGC 出现与我们的扩展冲突的新格式. 因此你不应该依赖这个功能!”

    (1) 实际上不知道这些标准中的一半是什么状态,但是 json、text 和 xml 似乎在任何给定应用程序的生命周期中都存在。

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 2021-10-26
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多