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.

Растры. Геопривязка

Эта тема очень полезна при работе со сканированными картами или материалами в неизвестной системе координат.
Популярные сайты, которые используют принцип совмещения различных карт разного периода: http://retromap.ru/ или http://www.etomesto.ru/
Я привожу туториалы Эдуарда Павлова, так как считаю, что их автор намного лучше разбирается в этой теме.

Привязка космоснимка

Когда, например, у космоснимка или карты нет геопривязки (особенно это касается старых снимков и старинных карт), остается привязывать по точкам. В случае старинных карт надо внимательно отнестись к возможным искажениям и не скупиться на точки привязки.


Важно выбрать правильный способ трансформации (источник):
  1. The Linear algorithm is used to create a world file and is different from the other algorithms, as it does not actually transform the raster. This algorithm likely won’t be sufficient if you are dealing with scanned material.
  2. The Helmert transformation performs simple scaling and rotation transformations.
  3. The Polynomial algorithms 1-3 are among the most widely used algorithms introduced to match source and destination ground control points. The most widely used polynomial algorithm is the second-order polynomial transformation, which allows some curvature. First-order polynomial transformation (affine) preserves collinearity and allows scaling, translation and rotation only.
  4. The Thin Plate Spline (TPS) algorithm is a more modern georeferencing method, which is able to introduce local deformations in the data. This algorithm is useful when very low quality originals are being georeferenced.
  5. The Projective transformation is a linear rotation and translation of coordinates.
В случае, если растр хорошо совпадает с точками привязки, можно применить 2 или даже 1. 
Для 3 и 4 необходимо расставлять точки равномерно. В сложных ситуациях лучше всего использовать алгоритм 4. 

Привязка карт по сетке

Когда на карте указана сетка с координатами, остается дело за малым - определить саму систему координат и выполнить привязку.




Самый простой вариант привязки


Самый простой и визуально наглядный вариант привязки похож на Photoshop. В видео не указан способ привязки по двум точкам - 2PT, который может сразу выравнить как требуется.