WIkipedia и Wikidata - показываем объекты на карте

Очень интересные источники - Wikipedia и его собрат Wikidata. Размещаем "энциклопедические" данные на карте не без помощи Excel. Все решения собраны по кусочкам, системного подхода предложить не могу. Чаще всего ответы находятся либо в примерах, либо на форумах с похожими вопросами.

Все запросы я отправляю через браузер - для новичков, включая меня, это вполне подходящий вариант.

Wikipedia и пространственный поиск

В случае Wikipedia есть справка по пространственному поиску статей, в которых даны координаты, и парочка готовых примеров, их можно посмотреть по ссылке на одну из страниц MediaWiki API.

Например: https://en.wikipedia.org/w/api.php?action=query&list=geosearch&gsradius=10000&gscoord=37.786971|-122.399677

Главное в этом запросе - это координаты точки, вокруг которой с заданным радиусом ggsradius собираются статьи. 

Важно: можно задать максимальный радиус поиска в 10 км, но в крупном городе лучше ставить куда меньше (в радиус 10 км могут попросту не попасть все объекты из-за ограничения на 500 объектов). Для центра Москвы неплохо сработал 1 км.

Если поменяем en на ru, то получим поиск в русскоязычном сегменте Википедии.

https://ru.wikipedia.org/w/api.php?action=query&generator=geosearch&redirects=1&prop=coordinates|langlinkscount|info&ggslimit=500&ggsradius=1000&ggscoord=55.75|37.55&colimit=500&format=json



В запросе выше поиск статей ведется на русском языке, точка взята в Москве, ggslimit = 500 - то есть мы запрашиваем максимум статей, формат json. Важное добавление langlinkscount - количество статей на других языках, что позволит нам как-то определить значимость статьи. Чаще всего с высокими показателями (если отбросим названия региона или города) окажутся местные достопримечательности и спортивные объекты.

Вместо точки ggscoord можно указать рамку для поиска gsbbox=широта верхнего левого угла|долгота верхнего левого угла|широта нижнего правого угла|долгота нижнего правого угла. В принципе, оптимально территорию разбить на квадраты и по ним создавать множество запросов.

Ну и напоследок пример с добавлением количества просмотров статьи (получено таким же методом поиска подобных решений):

https://ru.wikipedia.org/w/api.php?action=query&generator=geosearch&redirects=1&prop=coordinates|pageviews|langlinkscount|info&ggslimit=500&ggsradius=1000&ggscoord=55.75|37.55&colimit=500&format=json&pvipmetric=pageviews&pvipcontinue=


Статистика приходит за 60 дней, и ее надо бы суммировать на лету, но я пока до этого не добрался. Видимо, надо садиться за Python. Мы же ограничимся операциями в Excel.

В каждом ответе есть pageid, но нет ссылки на саму статью. Конкретный адрес статьи можно получить по такой схеме https://ru.wikipedia.org/?curid=365390 , где значение pageid подставляем после curid и переходим по такому адресу на саму статью.

Сохраним наш ответ на диск, если браузер это не сделал за нас (хотя можно вставить адрес запроса прямо в Excel)

JSON в Excel и в QGIS

Как эту красоту загрузить на карту? Я предлагаю это сделать через Excel. Формат json по своей структуре иерархичен, допускает вложенности атрибутов и прочее. То есть это не табличный формат. Здесь без видео будет трудновато.

Поиск в Wikidata

Wikidata - это база знаний (подробнее можно почитать здесь), которая в первую очередь дает нам объект (будь-то здание, человек, город или историческое событие) и его описание на основе утверждений. В том числе страница Викидаты часто содержит и ссылки на Википедию.

Запрос выполняется на языке SPARQL, похожем на SQL.

Длинные и размеренные видео в таких случаях очень полезны, советую для понимания базы https://youtu.be/kJph4q0Im98 Помимо этого, конечно, можно изучить большое количество примеров https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries/examples

А вот и несколько вариантов запросов, которые составил я для своих нужд.

Вариант с точкой и радиусом (адрес запроса https://w.wiki/nC2 )

SELECT ?place ?placeLabel ?location ?period ?fame ?distance
WHERE
{
  SERVICE wikibase:around { 
      ?place wdt:P625 ?location . 
      bd:serviceParam wikibase:center "Point(37.55 55.75)"^^geo:wktLiteral.
      bd:serviceParam wikibase:radius "10". # kilometers
      bd:serviceParam wikibase:distance ?distance. 
  } 
    ?place wikibase:sitelinks ?fame .
    OPTIONAL { ?place wdt:P571 ?period }.
#    FILTER NOT EXISTS { 
#    {?place wdt:P31 wd:Q123705 .}
#      UNION
#    { ?place wdt:P31 wd:Q7553685 .}
#    }
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "ru" . 
  }
}

Вариант с охватом по рамке(https://w.wiki/nBr):

SELECT ?place ?placeLabel ?location ?period ?fame
WHERE
{
  SERVICE wikibase:box { 
      ?place wdt:P625 ?location . 
      bd:serviceParam wikibase:cornerSouthWest "Point(37.55 55.70)"^^geo:wktLiteral.
      bd:serviceParam wikibase:cornerNorthEast "Point(37.70 55.80)"^^geo:wktLiteral.
  } 
    ?place wikibase:sitelinks ?fame .
    OPTIONAL { ?place wdt:P571 ?period }.
  
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "ru" . 
  }
}

Больше информации о пространственных запросах можно прочесть в статье Geospatial search for Wikidata Query Service и в справке Wikidata


Загрузка в QGIS

Если мы сохраним результат запроса в формат CSV, то дальше мы столкнемся с типовым описанием геометрии в виде текста, с чем хорошо справится QGIS.

Комментариев нет:

Отправить комментарий