【问题标题】:Postgis - What type to use for any geometry objectPostgis - 用于任何几何对象的类型
【发布时间】:2019-07-22 09:46:32
【问题描述】:

我正在尝试在 Laravel 项目中使用一些 postgis 函数来存储一些地理信息。

使用 Leaflet 及其 Leaflet-draw 插件,用户可以在地图上找到考古遗址的位置。但问题是,如果它是一个小而精确定位的站点,他可以将其定位为一个点,或者如果它更大或不精确,则可以在他在地图上绘制的多边形内定位。在地图上绘制的图层给了我一个 geojson,我想用 Postgis 将它转换为几何对象。

因此,对于我的“posha_sites”表,我需要一个可以存储任何内容的几何类型,在我看来,GeometryCollection 类型就是为此而设计的,所以这是我添加几何列时迁移的向上功能到我的桌子上。

public function up()
{
    Schema::table('posha_sites', function (Blueprint $table) {
        $table->geometrycollection('geometry');
    });
}

一开始我尝试使用在 GitHub 上找到的 njbarrett/laravel-postgis 包,但在尝试插入 add GeometryCollection 时遇到了 SRID 问题。

$site->geometry = new GeometryCollection([new Point(-48.23456, 20.12345)]);

这给了我这个错误:

Invalid parameter value: 7 ERREUR: Geometry SRID (0) does not match column SRID (4326)

我不知道这个包是否提供了一种指定 SRID 的方法,所以我只是尝试了一个使用 postgis 函数的原始 sql 查询:

update posha_sites set geometry = ST_SetSRID(ST_ASTEXT(ST_GeomFromGeoJSON(\'{"type":"Point","coordinates":[-48.23456,20.12345]}\')), 4326)

这样设置了 SRID 但我仍然收到错误:

Invalid parameter value: 7 ERREUR: Geometry type (Point) does not match column type (GeometryCollection) 

我应该插入什么以使其与 GeometryCollection 类型匹配,还是应该使用其他类型?

【问题讨论】:

    标签: laravel leaflet gis postgis geojson


    【解决方案1】:

    根据你的错误信息...

    Geometry type (Point) does not match column type (GeometryCollection)
    

    ...您的 PostGIS 列似乎是 GeometryCollection,但您的数据是 Point。实际上,您在这里向 PostGIS 提供了 GeoJSON Point geometry

    ST_GeomFromGeoJSON(\'{"type":"Point","coordinates":[-48.23456,20.12345]}\')
    

    这里的方法是将 GeoJSON Point 几何体包装成 GeoJSON GeometryCollection geometry,例如:

    ST_GeomFromGeoJSON(\'{"type":"GeometryCollection", "geometries": [{"type":"Point","coordinates":[-48.23456,20.12345]}]}\')
    

    请注意,GeometryCollection 可以有零个、一个或多个几何图形。 GeometryCollection 的 GeoJSON 表示包括一个几何数组(即[][{...}, {...}]) - 点周围的括号表示它是一个几何数组。

    另一种方法(取决于您的要求)是将 PostGIS 列类型从 GeometryCollection 更改为 Geometry(或 Geography,具体取决于您的场景中大地测量学的重要性)。一个Geometry PostGIS 字段可以保存PointsLineStrings、Polygons 或MultiGeometrys;而MultiGeometry 字段只能保存MultiGeometry 值(并且在该值内您可以打包其他几何类型)。

    如果最后一段令人困惑,我建议您熟悉Simple Features Specification,它解释了不同几何类型之间的关系。


    附录:有关列类型的相关 PostGIS 文档位于 https://postgis.net/docs/using_postgis_dbmanagement.html

    【讨论】:

    • 嗯,确实,几何类型是我正在寻找的,而不是几何集合。谢谢你。我记得我已经尝试过几何类型,但是当我尝试迁移时 DBAL 抛出了一个错误。在这里它可以工作,但我没有做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2023-01-11
    • 2019-11-04
    • 2021-06-28
    • 2011-10-14
    • 2014-10-06
    • 1970-01-01
    • 2020-12-25
    • 2013-01-09
    相关资源
    最近更新 更多