首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PostGIS中将几何图形转换为json会创建额外的行

在PostGIS中将几何图形转换为json会创建额外的行
EN

Stack Overflow用户
提问于 2022-11-07 15:27:07
回答 1查看 45关注 0票数 0

我想在Apache Superset绘制市政边界。Superset提供使用ISO-3166-2标准的地图和省份,但我想把各市划分为wel。有一个具有这些边框的形状文件,并按照在这个网站上指令将其转换为一个在这个网站上表。我使用shp2pgsql将形状文件添加到PostGIS数据库中。这就形成了一个表格,其中包含一些识别信息和一个二元宝石测量栏。

表的第一行长231.375个字符,如下所示(缩写):

代码语言:javascript
复制
"gid"   "gm_code"   "gm_naam"   "shape_leng"    "shape_area"    "geom"
   1    "GM0034"    "Almere"    122665.358635   109562253.490   "0106000020E61000000300000001030000000100000017000000806CE7FB2F560241408B6CE73E441D41801C5A643A520...

Superset无法读取这些信息,因此我通过以下查询将其转换为geojson:

代码语言:javascript
复制
CREATE TABLE gis.gemeente_2021_json AS
  SELECT gm_code, gm_naam, shape_area, 
      json_build_object(
        'type', 'Polygon',
        'geometry', ST_AsGeoJSON(ST_Transform((ST_DUMP(geom)).
            geom::geometry(Polygon, 4326), 4326))::json)::text as geojson

  FROM gis.gemeente_2021_v1;

结果是我从435个市开始,但我的新表格有1140个条目。一些示例输出如下所示。线很长,所以我剪线,用椭圆(.)代替。如您所见,市政"GM0034“突然在gejson列中有3行不同的条目,而我预计只有一行具有非常长的Geojson字符串。

代码语言:javascript
复制
    gm_code gm_naam shape_area  geojson
    GM0034  Almere  109562253.49    {"type" : "Polygon", "geometry" : {"type":"Polygon","coordinates":[[[150213.998,479503.726],[150087.298999999,479382.379000001],[150000.420000002,479461.258000001],[150000.354600001,479461.317400001],[150000.366300002,479461.327300001],[150001.45630,...]]]}}
    GM0034  Almere  109562253.49    {"type" : "Polygon", "geometry" : {"type":"Polygon","coordinates":[[[141872.969,483192.398800001],[141872.978100002,483192.398499999],[141872.984099999,483192.398499999],[141904.523899999,483191.793400001],[141912.174600001,483191.646699998],[141912.340999998, ...
    GM0034  Almere  109562253.49    {"type" : "Polygon", "geometry" : {"type":"Polygon","coordinates":[[[144312.481800001,492971.460499998],[144312.557,492971.443999998],[144312.633299999,492971.445799999],[144316.953000002,492971.539999999],[144321.4701,492972.263300002],[144321.730999999,492972.305], ...

虽然文档中提到多边形,但数据可能是多多边形。我试过了,但结果基本一样。

检查了postgres文档在最大的linelength,但这是大约1GB的文本每次发生,虽然行很长,250 K可以很容易地被Postgres处理。

任何关于我应该往哪里看的建议都是受欢迎的。

编辑1

正如@JGH正确地指出的那样,我在SRID中犯了一个很大的错误,形状文件的SRID是28992。我删除了表,用正确的SRID重新创建了它。它在openstreetmap上正确显示。现将其转换如下:

代码语言:javascript
复制
CREATE TABLE gis.gemeente_2021_json AS
  SELECT gm_code, gm_naam, shape_area, 
      json_build_object(
        'type', 'Polygon',
        'geometry', ST_AsGeoJSON(ST_Transform((ST_DUMP(geom)).
            geom::geometry(Polygon, 28992), 4326))::json)::text as geojson

  FROM gis.gemeente_2021_v1;

唉,同样的错误也适用。对于GM0034,仍然有3行。

编辑2

我根据@JGH的建议调整了查询:

代码语言:javascript
复制
CREATE TABLE gis.gemeente_2021_json AS
  SELECT gm_code, gm_naam, shape_area, 
      json_build_object(
        'type', 'MultiPolygon',
        'geometry', ST_AsGeoJSON(ST_Transform(
            geom::geometry(MultiPolygon, 28992), 4326))::json)::text as geojson

  FROM gis.gemeente_2021_v1;

这起作用了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-07 15:52:52

数据显示像[150213.998,479503.726]这样的坐标,但是代码包含行geom::geometry(Polygon, 4326),后面跟着无用的transform到4326。显示的坐标是而不是,在4326中,它们可能是在没有定义的CRS的情况下加载的(因此分配了0和cast作品)。

因此,数据被声明为lat-长4326,但包含另一个CRS的值,您最终得到的是无法正确处理的艺术坐标(也许它绕地球转了好几圈,可能会转到极点和后面等等)。任何事情都有可能发生)。垃圾进来,垃圾外泄。

因此,第一步是设置适当的CRS。然后,您可能会应用一个有用的转换从这个其他CRS到4326。如果您想要单个部件,请继续使用dump并处理属性重复。如果需要多个部分,请移除dump并将geojson类型设置为MultiPolygon

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

https://stackoverflow.com/questions/74348996

复制
相关文章

相似问题

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