如何循环访问Geojson元素

2022-04-09 00:00:00 python postgresql postgis sql geojson

问题描述

我想执行此问题中的代码https://gis.stackexchange.com/questions/142391/storing-geojson-featurecollection-to-postgresql-with-postgis/142479#142479 但当我运行该应用程序时,收到以下错误:

query="""
KeyError: ' "type"'

请告诉我如何修复它。

编码:

def exeGeoFromGeoJSONToWKT(self):        
    query="""
     WITH data AS (
        SELECT '{ "type": "FeatureCollection",
"features": [
  { "type": "Feature",
    "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
    "properties": {"prop0": "value0"}
    },
  { "type": "Feature",
    "geometry": {
      "type": "LineString",
      "coordinates": [
        [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
        ]
      },
    "properties": {
      "prop0": "value0",
      "prop1": 0.0
      }
    },
  { "type": "Feature",
     "geometry": {
       "type": "Polygon",
       "coordinates": [
         [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
           [100.0, 1.0], [100.0, 0.0] ]
         ]
     },
     "properties": {
       "prop0": "value0",
       "prop1": {"this": "that"}
       }
     }
   ]}'::json AS featuresCollection)
        SELECT 
        LIDARDataPolygonsAsGeometry
        FROM (
        SELECT 
            ST_Transform(ST_SetSRID(ST_GeomFromGeoJSON(feature->>'geometry'),4326),25832) AS LIDARDataPolygonsAsGeometry
           
        FROM (SELECT json_array_elements(featuresCollection->'features') AS feature 
                FROM data) AS f
    """
    print(query)        

    data = self.connection.query(query,[])
    # print(data)        
    return data

尝试:

 query="""
     WITH data AS (
        SELECT $${ "type": "FeatureCollection",
"features": [
  { "type": "Feature",
    "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
    "properties": {"prop0": "value0"}
    }
   ]}$$::json AS featuresCollection)
        SELECT 
        LIDARDataPolygonsAsGeometry
        FROM (
        SELECT 
            ST_Transform(ST_SetSRID(ST_GeomFromGeoJSON(feature->>'geometry'),4326),25832) AS LIDARDataPolygonsAsGeometry
           
        FROM (SELECT json_array_elements(featuresCollection->'features') AS feature 
                FROM data) AS f
    """

解决方案

从数据库的角度来看,查询运行良好,但问题似乎出在查询构建上。您的查询有一个包含多个"双引号的JSON文档,因此您可以转义它们("),或者尝试使用另一个answer中所述的参数将JSON添加到查询中。

无关:您不需要这3个嵌套子查询。一个查询就可以了:

WITH data AS (
   SELECT '{ "type": "FeatureCollection",
           ...
          ]}'::json AS mygeojson
)

SELECT 
 ST_Transform(
  ST_SetSRID(
    ST_GeomFromGeoJSON(json_array_elements(
      mygeojson->'features')->>'geometry'),
   4326),
  25832) AS feature 
FROM data   

相关文章