代码之家  ›  专栏  ›  技术社区  ›  Maxime

获取几何体的外环,并将其放入geojson对象-Postgis-SQL中

  •  0
  • Maxime  · 技术社区  · 7 年前

    几天来,我一直在搜索一个SQL查询,该查询允许我创建一个GeoJSON,该JSON将为我提供数据库中多边形的轮廓。

    第一个查询工作正常,它允许只在一个单元格中获得一个Geojson对象,其中包含所有多多边形。

     SELECT json_build_object(
        'type', 'FeatureCollection',
        'features', json_agg(
            json_build_object(
                'type', 'Feature',
                'geometry', ST_AsGeoJSON( 
                    the_geom
                )::json,
                'properties', json_build_object(
                    'name', name
                )
            )
        )
    )
    FROM layer
    

    现在,我尝试获取相同的GeoJson对象,但使用Linestring而不是multipolygons。函数ST\u ExteriorRing()似乎与函数json\u agg()不兼容?我不知道我必须改变什么才能让它生效。。。

    SELECT json_build_object(
        'type', 'FeatureCollection',
        'features', json_agg(
            json_build_object(
                'type', 'Feature',
                'geometry', ST_AsGeoJSON(
                    ST_ExteriorRing( -- get the exterior lines of multipolygons
                        ST_GeometryN(
                            the_geom,
                            generate_series(
                                1, 
                                ST_NumGeometries(the_geom)
                            )
                        )
                     )
                )::json,
                'properties', json_build_object(
                    'name', name
                )
            )
        )
    )
    FROM layer
    

    如果我抑制json\u agg()函数,它可以正常工作,但在这种情况下,输出中没有任何单元格。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Maxime    6 年前

    几个月后我发现了它,答案如下:

    SELECT json_build_object(
        'type', 'FeatureCollection',
        'features', json_agg(feature)
    ) as geojson
    FROM (
        SELECT json_build_object(
            'type', 'Feature',
            'geometry', ST_AsGeoJSON(
                  ST_ExteriorRing(
                       ST_GeometryN(
                             ST_Union(the_geom),1
                       )
                  )
            )::json
        ) as feature    
        FROM layer
    ) t