如何从 BigQuery 中的 Openstreet 地图数据集中提取所有国家/地区的几何图形
how to extract all countries geometry from Openstreet map dataset in BigQuery
我正在使用这个查询来使用 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
抱歉忘了说,有些标签丢失了,例如,如果你 select admin_level = 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
对于美国,我发现 link 解释了关于美国的一切..
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 记录中也不存在。不知道为什么,可能是旧版本吧
因此您可以使用上面的查询优化您的过滤器以包括美国。
我们可以通过合并 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)
受前面两个不再有效的答案的启发。
由于 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
我正在使用这个查询来使用 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
抱歉忘了说,有些标签丢失了,例如,如果你 select admin_level = 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
对于美国,我发现 link 解释了关于美国的一切.. 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 记录中也不存在。不知道为什么,可能是旧版本吧
因此您可以使用上面的查询优化您的过滤器以包括美国。
我们可以通过合并 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)
受前面两个不再有效的答案的启发。 由于 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