Как извлечь геометрию всех стран из набора данных Openstreet Map в BigQuery - PullRequest
1 голос
/ 17 апреля 2020

Я использую этот запрос для извлечения геометрии всех стран, использующих 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, такие страны, как США, будут сброшены

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Мы можем составить список всех стран и их геометрий, объединив 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

enter image description here

( ref )

0 голосов
/ 17 апреля 2020

В соответствии с https://wiki.openstreetmap.org/wiki/Tag: border% 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. Я не знаю почему, это может быть просто старая версия.

Так что вы можете оптимизировать свои фильтры, используя запрос выше, чтобы включить США.

...