【问题标题】:how to iterate through geojson elements如何遍历geojson元素
【发布时间】:2021-10-04 02:24:02
【问题描述】:

我想执行这个问题中的代码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
    """

【问题讨论】:

    标签: python sql postgresql postgis geojson


    【解决方案1】:

    从数据库的角度来看,查询工作正常,但问题似乎出在查询构建中。您的查询有一个包含多个 " 双引号的 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   
    

    【讨论】:

    • 请参阅上面的尝试部分。我按照你的建议尝试了,但我得到了相同的结果#
    • @LetsamrIt 从数据库的角度来看这个查询有效。构建 sql 语句时,您在 python 中遇到问题。也许您应该使用参数构建查询(因为我相信这个 json 文档不会被硬编码;-)),例如stackoverflow.com/a/44693970/2275388
    • featuresCollection 和 FeatureCollection 一样吗??
    • @Letsamr 这取决于。 featuresCollection 是您为 json 文档选择的别名,它不区分大小写。 "FeatureCollection" 是 json 文档中 "type" 的值,我认为它区分大小写;)
    • @LetsamrIt 我编辑了我的答案以使我的观点更清楚。注意 json 文档/字符串的新别名。
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多