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

1
Mim 17 Апр 2020 в 12:37

2 ответа

Лучший ответ

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

1
Felipe Hoffa 17 Апр 2020 в 20:34

Согласно 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 / отношение / 148838 # карта = 1 /41/ 0 На левой стороне есть все функции.

Кроме того, вы можете найти запись США в BigQuery с этим:

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

Даже если в записи openstreetmap есть admin_level, в записи BigQuery его нет. Я не знаю почему, это может быть просто старая версия.

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

0
Sabri Karagönen 17 Апр 2020 в 11:40