【问题标题】:how to extract all countries geometry from Openstreet map dataset in BigQuery如何从 BigQuery 中的 Openstreet 地图数据集中提取所有国家/地区的几何图形
【发布时间】:2020-04-17 09:37:53
【问题描述】:

我正在使用此查询来使用 OSM 提取所有国家/地区的几何图形,它工作正常,但我确信,它正在创建一个重复项,因为我使用标志作为参考,有些地方有一个标志,但它们是不是真正的国家

SELECT feature_type, osm_id, osm_timestamp, geometry,ar.key,ar.value,
  FROM `bigquery-public-data.geo_openstreetmap.planet_features`,UNNEST(all_tags) ar
   where ('boundary', 'administrative') IN (SELECT (key, value) FROM UNNEST(all_tags))
   and(feature_type="polygon" or feature_type= "multipolygon")
   AND ('flag') IN (SELECT (key) FROM UNNEST(all_tags)) and ar.key="name" order by st_area(geometry) desc

抱歉忘了说,有些标签丢失了,例如,如果您选择 admin_level = 2,美国等国家/地区将被删除

【问题讨论】:

    标签: google-bigquery gis openstreetmap


    【解决方案1】:

    我们可以通过合并 2 个表来列出所有国家及其几何形状:

    SELECT features.feature_type, features.osm_id
      , ARRAY(
         SELECT DISTINCT AS STRUCT * FROM UNNEST(features.all_tags||relations.all_tags)
         WHERE key IN('int_name', 'name')
         ORDER BY 1 LIMIT 1 
      ) features
     , ROUND(ST_AREA(geometry)/1e6,1) area
    FROM
      `bigquery-public-data.geo_openstreetmap.planet_features` AS features,
      `bigquery-public-data.geo_openstreetmap.planet_relations` AS relations
    WHERE ('boundary','administrative') IN (SELECT (key,value) FROM UNNEST(features.all_tags))
    AND ('admin_level','2') IN (SELECT (key,value) FROM UNNEST(relations.all_tags))
    AND feature_type = 'multipolygon'
    AND relations.id=SAFE_CAST(features.osm_id AS INT64)
    ORDER BY area
    

    (ref)

    【讨论】:

      【解决方案2】:

      根据https://wiki.openstreetmap.org/wiki/Tag:boundary%3Dadministrative#National admin_level = 2 描述国家/地区。

      所以我整理了您的查询并添加了 admin_level = 2 过滤器,以便它只包括国家/地区。

      SELECT 
        feature_type, osm_id, osm_timestamp, geometry,
        (SELECT value FROM UNNEST(all_tags) WHERE key = 'flag') as flag,
        (SELECT value FROM UNNEST(all_tags) WHERE key = 'name') as name,
        st_area(geometry) as area
      FROM `bigquery-public-data.geo_openstreetmap.planet_features`
      WHERE 
        feature_type in ("polygon", "multipolygon")
        AND EXISTS (SELECT 1 FROM UNNEST(all_tags) WHERE key = 'boundary' AND value = 'administrative')
        AND EXISTS (SELECT 1 FROM UNNEST(all_tags) WHERE key = 'flag') 
        AND EXISTS (SELECT 1 FROM UNNEST(all_tags) WHERE key = 'admin_level' AND value = '2') 
      ORDER BY area desc
      

      对于美国,我发现该链接解释了有关美国的一切。 https://wiki.openstreetmap.org/wiki/United_States/Boundaries#National_boundary

      您可以在此处查看美国的 openstreetmap 记录 https://www.openstreetmap.org/relation/148838#map=1/41/0 在左侧,有所有功能。

      此外,您可以通过以下方式在 BigQuery 中找到美国记录:

      SELECT *
      FROM `bigquery-public-data.geo_openstreetmap.planet_features`
      where osm_id = '148838'
      

      即使 openstreetmap 记录中有 admin_level,BigQuery 记录中也不存在。我不知道为什么,它可能只是一个旧版本。

      因此您可以使用上面的查询优化您的过滤器以包括美国。

      【讨论】:

      • 实际上,这是我的问题,bigquery 数据集中有一个错误,我知道美国,因为它有很大的面积,但是其他国家呢,我如何确定所有国家都被考虑在内
      • 肯定是关于 BigQuery 的。我不知道它多久更新一次,但最后一次更新日期是3月28日。您可能希望在 BigQuery 问题跟踪器中创建问题。你可以在这里问:issuetracker.google.com/…
      • 这里已经报告了一个问题issuetracker.google.com/issues/153934378
      • 检查我留下的答案 - 通过 JOIN 解决了​​这个问题
      【解决方案3】:

      受先前两个不再起作用的答案的启发。 由于 GeoOpenStreet 中的一些枚举类型更改(例如将多面体重命名为多面体),并且不认为该标志是强制性的,而是 ISO 代码。

      SELECT (SELECT value FROM UNNEST(all_tags) WHERE key = 'ISO3166-1:alpha2') as CountryISO2Code,
        geometry AS CountryGeometry,
        st_area(geometry) as CountryArea
      FROM `bigquery-public-data.geo_openstreetmap.planet_features`
      WHERE EXISTS (SELECT 1 FROM UNNEST(all_tags) WHERE key = 'boundary' AND value = 'administrative')
        AND EXISTS (SELECT 1 FROM UNNEST(all_tags) WHERE key = 'admin_level' AND value = '2') 
        AND EXISTS (SELECT 1 FROM UNNEST(all_tags) WHERE key = 'ISO3166-1:alpha2') 
      ORDER BY CountryArea DESC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 2019-12-16
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多