Пакетное геокодирование в QGIS: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
мНет описания правки
Нет описания правки
Строка 1: Строка 1:
{{Статья|Черновик}}
{{Статья|Черновик}}
{{Аннотация|Геокодирование в QGIS с помощью сервисов Google, Yandex, OSM(Nominatim).}}
{{Аннотация|Геокодирование в QGIS с помощью сервисов Google, Yandex, OSM Nominatim.}}
 
== Введение ==
== Введение ==
Одним из способов получения геоданных является операция геокодирования. Она позволяет получить координаты объектов, у которых заранее известны адреса. В связи с большим объемом адресных БД, эту операцию обычно производят сервисы геокодирования. Наиболее известные сервисы на данный момент - [http://developers.google.com/maps/documentation/geocoding/?hl=ru Google Geocoding], [http://api.yandex.ru/maps/doc/geocoder/desc/concepts/About.xml Яндекс.Карты Геокодирование] и [http://wiki.openstreetmap.org/wiki/Nominatim OSM Nominatim].<br />
Одним из способов получения геоданных из адресной информации является операция геокодирования. Геокодирование позволяет получить координаты объектов, адреса которых известны. В связи с большим объемом адресных БД, эту операцию обычно производят сервисы геокодирования. Наиболее известные сервисы на данный момент - [http://developers.google.com/maps/documentation/geocoding/?hl=ru Google Geocoding], [http://api.yandex.ru/maps/doc/geocoder/desc/concepts/About.xml Яндекс.Карты Геокодирование] и [http://wiki.openstreetmap.org/wiki/Nominatim OSM Nominatim].
 
QGIS не имеет встроенной возможности пользоваться сервисами геокодирования. Но гибкая система расширений позволяет добавлять практически любые функции. Для выполнения пакетного геокодирования можно использовать расширение [http://plugins.qgis.org/plugins/ru_geocoder/ RuGeocoder].
QGIS не имеет встроенной возможности пользоваться сервисами геокодирования. Но гибкая система расширений позволяет добавлять практически любые функции. Для выполнения пакетного геокодирования можно использовать расширение [http://plugins.qgis.org/plugins/ru_geocoder/ RuGeocoder].


Строка 10: Строка 12:
* Расширение RuGeocoder (Присутствует в [http://plugins.qgis.org/plugins/ru_geocoder/ официальном репозитории])
* Расширение RuGeocoder (Присутствует в [http://plugins.qgis.org/plugins/ru_geocoder/ официальном репозитории])
* Соединение с Интернетом (желательно быстрое)
* Соединение с Интернетом (желательно быстрое)
При подготовке данных также может понадобиться расширенный калькулятор атрибутивных полей. В примерах будет использоваться расширение [http://gis-lab.info/qa/fieldpyculator.html FieldPyculator].<br />
 
Процесс установки QGIS подробно описан в статье [http://gis-lab.info/qa/qgis-osgeo4w.html Установка QGIS/GRASS с помощью OSGeo4W].<br />
При подготовке данных также может понадобиться расширенный калькулятор атрибутивных полей. В примерах будет использоваться расширение [http://gis-lab.info/qa/fieldpyculator.html FieldPyculator].
 
Процесс установки QGIS подробно описан в статье [http://gis-lab.info/qa/qgis-osgeo4w.html Установка QGIS/GRASS с помощью OSGeo4W].
 
Более подробно об установке расширений можно прочитать [http://gis-lab.info/qa/qgis-install-plugin.html тут].
Более подробно об установке расширений можно прочитать [http://gis-lab.info/qa/qgis-install-plugin.html тут].


Строка 18: Строка 23:


=== Преобразование таблицы в SHP файл ===
=== Преобразование таблицы в SHP файл ===
Достаточно часто входные данные представлены в виде обычных таблиц. Наиболее удобный формат для обработки - CSV. С данным форматом могут работать практически все современные табличные редакторы: MS Excel, OpenOffice Calc и другие.<br />
Достаточно часто входные данные представлены в виде обычных таблиц. Наиболее удобный формат для обработки - CSV. С данным форматом могут работать практически все современные табличные редакторы: MS Excel, OpenOffice Calc и другие.
Для геокодирования таблицы её необходимо конвертировать в любой формат геоданных, которые можно редактировать в QGIS - SHP, sqlite, mapinfo и тд. Это преобразование можно сделать с помощью ogr2ogr (подробное описание можно прочитать в статье [http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]). Но данный метод требует создания vrt файла и использование командной строки. <br />
 
Для геокодирования таблицы её необходимо конвертировать в любой формат геоданных, которые можно редактировать в QGIS - SHP, sqlite, mapinfo и тд. Это преобразование можно сделать с помощью ogr2ogr (подробное описание можно прочитать в статье [http://gis-lab.info/qa/csv2shp.html Конвертация данных из CSV в SHP и обратно с OGR]). Но данный метод требует создания vrt файла и использование командной строки.
 
Для удобства RuGeocoder имеет встроенную функцию с подобным преобразованием. На панели "Модули" необходимо нажать кнопку "Конвертировать CSV в SHP" [[Файл:RuGeocoder Convert.png]]. То же действие можно выполнить через меню "Модули" -> "RuGeocoder" -> "Конвертировать CSV в SHP". В открывшейся форме нужно выбрать входной CSV файл и указать путь, по которому будет сохранен результирующий SHP файл.
Для удобства RuGeocoder имеет встроенную функцию с подобным преобразованием. На панели "Модули" необходимо нажать кнопку "Конвертировать CSV в SHP" [[Файл:RuGeocoder Convert.png]]. То же действие можно выполнить через меню "Модули" -> "RuGeocoder" -> "Конвертировать CSV в SHP". В открывшейся форме нужно выбрать входной CSV файл и указать путь, по которому будет сохранен результирующий SHP файл.
<center>[[Файл:RuGeocoder Converter form.png]]</center>
<center>[[Файл:RuGeocoder Converter form.png]]</center>
В результате конвертации, будет получен точечный shp файл с той же самой атрибутикой и нулевыми координатами.  
В результате конвертации, будет получен точечный shp файл с той же самой атрибутикой и нулевыми координатами.  
Если включена соответствующая опция, то к атрибутике будут добавлены пустые поля типа string: settlement, street, building_n и geocoded. Данные поля можно будет использовать в целях подготовки адреса для геокодера.<br />
Если включена соответствующая опция, то к атрибутике будут добавлены пустые поля типа string: settlement, street, building_n и geocoded. Данные поля можно будет использовать в целях подготовки адреса для геокодера.
'''Кодировка данных выходного слоя будет такой же, как у входного.''' Если CSV файл был сохранен в UTF-8, то SHP будет иметь ту же кодировку. Возможно, после добавление слоя на карту у него будет выставлена неверная кодировка (зависит от настроек по умолчанию). Изменить кодировку можно в свойствах слоя на вкладке ''Общие'', ''Параметры источника''. <br />
 
'''Кодировка данных выходного слоя будет такой же, как у входного.''' Если CSV файл был сохранен в UTF-8, то SHP будет иметь ту же кодировку. Возможно, после добавление слоя на карту у него будет выставлена неверная кодировка (зависит от настроек по умолчанию). Изменить кодировку можно в свойствах слоя на вкладке ''Общие'', ''Параметры источника''.
 
Рассмотрим для примера CSV файл ([[Файл:RuGeocoder_Ufa-leninsky_utf8.zip]]), содержащий адреса УИК Ленинского района г. Уфы. После конвертирования получаем следующий SHP файл: [[Файл:Ufa-leninsky utf8 shp.zip]].
Рассмотрим для примера CSV файл ([[Файл:RuGeocoder_Ufa-leninsky_utf8.zip]]), содержащий адреса УИК Ленинского района г. Уфы. После конвертирования получаем следующий SHP файл: [[Файл:Ufa-leninsky utf8 shp.zip]].


=== Подготовка адреса ===
=== Подготовка адреса ===
Для повышения качества геокодирования необходимо разбить адрес на составные части: населенный пункт, улица, строение. Каждая из частей должна находиться в отдельном поле (название населенного пункта можно не помещать в отдельное поле, а указать вручную, если все адреса в слое принадлежат этому населенному пункту). Если исходные данные изначально были в такой форме, то этот пункт обработки можно пропустить.<br />
Для повышения качества геокодирования необходимо разбить адрес на составные части: населенный пункт, улица, строение. Каждая из частей должна находиться в отдельном поле (название населенного пункта можно не помещать в отдельное поле, а указать вручную, если все адреса в слое принадлежат этому населенному пункту). Если исходные данные изначально были в такой форме, то этот пункт обработки можно пропустить.
 
Как примером воспользуемся ранее подготовленным SHP файлом. Добавим его в проект и с помощью FieldPyculator подготовим необходимые поля. Как видно по полю ''addr_vote'', адреса указаны единообразно, но содержат лишнюю информацию: номера школ, название организаций и тд. Выделим название улиц, используя следующее выражение для Pyculator:
Как примером воспользуемся ранее подготовленным SHP файлом. Добавим его в проект и с помощью FieldPyculator подготовим необходимые поля. Как видно по полю ''addr_vote'', адреса указаны единообразно, но содержат лишнюю информацию: номера школ, название организаций и тд. Выделим название улиц, используя следующее выражение для Pyculator:
<pre>
 
value =  <addr_vote>.split(',')[1].replace(u'ул.','').strip()
<pre>value =  <addr_vote>.split(',')[1].replace(u'ул.','').strip()</pre>
</pre>
 
Для получения номеров строений используем следующий код:
Для получения номеров строений используем следующий код:
<pre>
 
value =  <addr_vote>.split(',')[2].strip().split(' ')[0]
<pre>value =  <addr_vote>.split(',')[2].strip().split(' ')[0]</pre>
</pre>
 
В результате, получаем SHP файл ([[Файл:Ufa-leninsky utf8 shp attr.zip]]) с заполненными полями ''street'' и ''building_n''. Исключением является одна запись (УИК с номером 187), в поле ''street'' которой попало название поселка. Данный недостаток легко исправить вручную.<br />
В результате, получаем SHP файл ([[Файл:Ufa-leninsky utf8 shp attr.zip]]) с заполненными полями ''street'' и ''building_n''. Исключением является одна запись (УИК с номером 187), в поле ''street'' которой попало название поселка. Данный недостаток легко исправить вручную.
 
Больше примеров обработки адресов можно найти на странице в вики: [[Проект_УИК_Республики_Башкортостан]].
Больше примеров обработки адресов можно найти на странице в вики: [[Проект_УИК_Республики_Башкортостан]].


== Геокодирование ==
== Геокодирование ==
После предварительной подготовки адресов можно приступать к самому геокодированию. Геокодировать можно любой точечный слой, редактирование которого возможно в QGIS (PostGIS, sqlite, MSSQL и т.д.). Слой для обработки должен быть добавлен в проект и открыт на редактирование.
После предварительной подготовки адресов можно приступать к самому геокодированию. Геокодировать можно любой точечный слой, редактирование которого возможно в QGIS (PostGIS, sqlite, MSSQL и т.д.). Слой для обработки должен быть добавлен в проект и открыт на редактирование.
Форма обработки вызывается нажатием кнопки "Пакетное геокодирование" [[Файл:RuGeocoder_Geocode.png]] на панели "Модули". Тоже действие можно выполнить через меню "Модули". <br />
 
Форма обработки вызывается нажатием кнопки "Пакетное геокодирование" [[Файл:RuGeocoder_Geocode.png]] на панели "Модули". Тоже действие можно выполнить через меню "Модули".
 
В открывшейся форме прежде всего необходимо выбрать слой для геокодирования. Если адрес записан в одном поле, то достаточно выбрать это поле.
В открывшейся форме прежде всего необходимо выбрать слой для геокодирования. Если адрес записан в одном поле, то достаточно выбрать это поле.
<center>[[Файл:RuGeocoder_AddrMerge.png]]</center>
<center>[[Файл:RuGeocoder_AddrMerge.png]]</center>
Для улучшения результатов геокодирования крайне желательно указать регион, включив соответствующий переключатель и выбрав из списка необходимый субъект. Если в слое присутствуют адреса из нескольких населенных пунктов, то необходимо выбрать поле, содержащее название поселения. Если же все адреса относятся к одному населенному пункту, то его название можно указать вручную. Аналогичная ситуация с районам.<br />
Для улучшения результатов геокодирования крайне желательно указать регион, включив соответствующий переключатель и выбрав из списка необходимый субъект. Если в слое присутствуют адреса из нескольких населенных пунктов, то необходимо выбрать поле, содержащее название поселения. Если же все адреса относятся к одному населенному пункту, то его название можно указать вручную. Аналогичная ситуация с районам.
 
<center>[[Файл:RuGeocoder_AddrPartialSplit.png]]</center>
<center>[[Файл:RuGeocoder_AddrPartialSplit.png]]</center>
Идеальным случаем является вариант, когда адрес компонентный. Включив переключатель "Улица", можно указать поле содержащее название улицы и поле содержащее номер строения.
Идеальным случаем является вариант, когда адрес компонентный. Включив переключатель "Улица", можно указать поле содержащее название улицы и поле содержащее номер строения.
<center>[[Файл:RuGeocoder AddrSplit.png]]</center>
<center>[[Файл:RuGeocoder AddrSplit.png]]</center>
Выбрав геокодер, можно запускать процесс обработки. Время выполнения геокодирования зависит от количества записей в слое, скорости соединения и загруженности выбранного сервиса. Геометрии записей, для которых геокодирование прошло успешно, будут изменены в соответствии с полученными результатами. В случае, когда геокодер не смог найти необходимое здание, будут возвращены координаты улицы, а при невозможности определить улицу - координаты населенного пункта. Для записей, адреса которых не распознаны геокодером, будут записаны нулевые координаты. Также, если в слое присутствует поле "geocoded", то в него будет записан адрес, который вернул геокодер. Данное поле удобно использовать для анализа результатов обработки.<br />
 
Если после геокодирования в слое много точек с нулевыми координатами (поле "geocoded" содержит много значений "Not found") или точки попадают в центр населенного пункта ("geocoded" содержит название поселения), то либо неудачно подобран геокодер, либо адреса подготовлены плохо и не могут быть распознаны.<br />
Выбрав геокодер, можно запускать процесс обработки. Время выполнения геокодирования зависит от количества записей в слое, скорости соединения и загруженности выбранного сервиса. Геометрии записей, для которых геокодирование прошло успешно, будут изменены в соответствии с полученными результатами. В случае, когда геокодер не смог найти необходимое здание, будут возвращены координаты улицы, а при невозможности определить улицу - координаты населенного пункта. Для записей, адреса которых не распознаны геокодером, будут записаны нулевые координаты. Также, если в слое присутствует поле "geocoded", то в него будет записан адрес, который вернул геокодер. Данное поле удобно использовать для анализа результатов обработки.
В первом случае можно попробовать выбрать другой сервис из списка доступных. Следует учесть, что для больших и средних городов наиболее подходящим является Yandex. Для малых населенных пунктов чаще подходит OSM, хотя в некоторых случаях Yandex не отстает. Google хорошо справляется с задачей в основном в крупных городах.<br />
 
Если после геокодирования в слое много точек с нулевыми координатами (поле "geocoded" содержит много значений "Not found") или точки попадают в центр населенного пункта ("geocoded" содержит название поселения), то либо неудачно подобран геокодер, либо адреса подготовлены плохо и не могут быть распознаны.
 
В первом случае можно попробовать выбрать другой сервис из списка доступных. Следует учесть, что для больших и средних городов наиболее подходящим является Yandex. Для малых населенных пунктов чаще подходит OSM, хотя в некоторых случаях Yandex не отстает. Google хорошо справляется с задачей в основном в крупных городах.
 
Если смена геокодера не приводит к значительным изменениям результата, то следует приложить больше усилий для подготовки компонентного адреса.
Если смена геокодера не приводит к значительным изменениям результата, то следует приложить больше усилий для подготовки компонентного адреса.


==После геокодирования==
==После геокодирования==
Результатом геокодирования является изменение геометрии. Координаты точек в таблицу не записываются. Если вам необходимо табличное представление координат, выберите в меню "Вектор->Обработка геометрии" пункт "Экспортировать / добавить поле геометрии".
Результатом геокодирования является изменение геометрии. Координаты точек в таблицу не записываются. Если вам необходимо табличное представление координат, выберите в меню "Вектор->Обработка геометрии" пункт "Экспортировать / добавить поле геометрии".

Версия от 20:13, 9 октября 2012

Эта страница является черновиком статьи.


Геокодирование в QGIS с помощью сервисов Google, Yandex, OSM Nominatim.

Введение

Одним из способов получения геоданных из адресной информации является операция геокодирования. Геокодирование позволяет получить координаты объектов, адреса которых известны. В связи с большим объемом адресных БД, эту операцию обычно производят сервисы геокодирования. Наиболее известные сервисы на данный момент - Google Geocoding, Яндекс.Карты Геокодирование и OSM Nominatim.

QGIS не имеет встроенной возможности пользоваться сервисами геокодирования. Но гибкая система расширений позволяет добавлять практически любые функции. Для выполнения пакетного геокодирования можно использовать расширение RuGeocoder.

Подготовка к работе

Для выполнения геокодирования понадобятся:

При подготовке данных также может понадобиться расширенный калькулятор атрибутивных полей. В примерах будет использоваться расширение FieldPyculator.

Процесс установки QGIS подробно описан в статье Установка QGIS/GRASS с помощью OSGeo4W.

Более подробно об установке расширений можно прочитать тут.

Подготовка данных

Для работы геокодер требует точечный слой с адресами, находящимися в одном или нескольких атрибутивных полях. Компонентная форма записи адреса (название города, название улицы, номер дома и т.д. находятся в отдельных полях) более предпочтительна и обычно позволяет добиться значительно лучшего результата при использовании любого геокодера.

Преобразование таблицы в SHP файл

Достаточно часто входные данные представлены в виде обычных таблиц. Наиболее удобный формат для обработки - CSV. С данным форматом могут работать практически все современные табличные редакторы: MS Excel, OpenOffice Calc и другие.

Для геокодирования таблицы её необходимо конвертировать в любой формат геоданных, которые можно редактировать в QGIS - SHP, sqlite, mapinfo и тд. Это преобразование можно сделать с помощью ogr2ogr (подробное описание можно прочитать в статье Конвертация данных из CSV в SHP и обратно с OGR). Но данный метод требует создания vrt файла и использование командной строки.

Для удобства RuGeocoder имеет встроенную функцию с подобным преобразованием. На панели "Модули" необходимо нажать кнопку "Конвертировать CSV в SHP" RuGeocoder Convert.png. То же действие можно выполнить через меню "Модули" -> "RuGeocoder" -> "Конвертировать CSV в SHP". В открывшейся форме нужно выбрать входной CSV файл и указать путь, по которому будет сохранен результирующий SHP файл.

RuGeocoder Converter form.png

В результате конвертации, будет получен точечный shp файл с той же самой атрибутикой и нулевыми координатами. Если включена соответствующая опция, то к атрибутике будут добавлены пустые поля типа string: settlement, street, building_n и geocoded. Данные поля можно будет использовать в целях подготовки адреса для геокодера.

Кодировка данных выходного слоя будет такой же, как у входного. Если CSV файл был сохранен в UTF-8, то SHP будет иметь ту же кодировку. Возможно, после добавление слоя на карту у него будет выставлена неверная кодировка (зависит от настроек по умолчанию). Изменить кодировку можно в свойствах слоя на вкладке Общие, Параметры источника.

Рассмотрим для примера CSV файл (Файл:RuGeocoder Ufa-leninsky utf8.zip), содержащий адреса УИК Ленинского района г. Уфы. После конвертирования получаем следующий SHP файл: Файл:Ufa-leninsky utf8 shp.zip.

Подготовка адреса

Для повышения качества геокодирования необходимо разбить адрес на составные части: населенный пункт, улица, строение. Каждая из частей должна находиться в отдельном поле (название населенного пункта можно не помещать в отдельное поле, а указать вручную, если все адреса в слое принадлежат этому населенному пункту). Если исходные данные изначально были в такой форме, то этот пункт обработки можно пропустить.

Как примером воспользуемся ранее подготовленным SHP файлом. Добавим его в проект и с помощью FieldPyculator подготовим необходимые поля. Как видно по полю addr_vote, адреса указаны единообразно, но содержат лишнюю информацию: номера школ, название организаций и тд. Выделим название улиц, используя следующее выражение для Pyculator:

value =  <addr_vote>.split(',')[1].replace(u'ул.','').strip()

Для получения номеров строений используем следующий код:

value =  <addr_vote>.split(',')[2].strip().split(' ')[0]

В результате, получаем SHP файл (Файл:Ufa-leninsky utf8 shp attr.zip) с заполненными полями street и building_n. Исключением является одна запись (УИК с номером 187), в поле street которой попало название поселка. Данный недостаток легко исправить вручную.

Больше примеров обработки адресов можно найти на странице в вики: Проект_УИК_Республики_Башкортостан.

Геокодирование

После предварительной подготовки адресов можно приступать к самому геокодированию. Геокодировать можно любой точечный слой, редактирование которого возможно в QGIS (PostGIS, sqlite, MSSQL и т.д.). Слой для обработки должен быть добавлен в проект и открыт на редактирование.

Форма обработки вызывается нажатием кнопки "Пакетное геокодирование" RuGeocoder Geocode.png на панели "Модули". Тоже действие можно выполнить через меню "Модули".

В открывшейся форме прежде всего необходимо выбрать слой для геокодирования. Если адрес записан в одном поле, то достаточно выбрать это поле.

RuGeocoder AddrMerge.png

Для улучшения результатов геокодирования крайне желательно указать регион, включив соответствующий переключатель и выбрав из списка необходимый субъект. Если в слое присутствуют адреса из нескольких населенных пунктов, то необходимо выбрать поле, содержащее название поселения. Если же все адреса относятся к одному населенному пункту, то его название можно указать вручную. Аналогичная ситуация с районам.

RuGeocoder AddrPartialSplit.png

Идеальным случаем является вариант, когда адрес компонентный. Включив переключатель "Улица", можно указать поле содержащее название улицы и поле содержащее номер строения.

RuGeocoder AddrSplit.png

Выбрав геокодер, можно запускать процесс обработки. Время выполнения геокодирования зависит от количества записей в слое, скорости соединения и загруженности выбранного сервиса. Геометрии записей, для которых геокодирование прошло успешно, будут изменены в соответствии с полученными результатами. В случае, когда геокодер не смог найти необходимое здание, будут возвращены координаты улицы, а при невозможности определить улицу - координаты населенного пункта. Для записей, адреса которых не распознаны геокодером, будут записаны нулевые координаты. Также, если в слое присутствует поле "geocoded", то в него будет записан адрес, который вернул геокодер. Данное поле удобно использовать для анализа результатов обработки.

Если после геокодирования в слое много точек с нулевыми координатами (поле "geocoded" содержит много значений "Not found") или точки попадают в центр населенного пункта ("geocoded" содержит название поселения), то либо неудачно подобран геокодер, либо адреса подготовлены плохо и не могут быть распознаны.

В первом случае можно попробовать выбрать другой сервис из списка доступных. Следует учесть, что для больших и средних городов наиболее подходящим является Yandex. Для малых населенных пунктов чаще подходит OSM, хотя в некоторых случаях Yandex не отстает. Google хорошо справляется с задачей в основном в крупных городах.

Если смена геокодера не приводит к значительным изменениям результата, то следует приложить больше усилий для подготовки компонентного адреса.

После геокодирования

Результатом геокодирования является изменение геометрии. Координаты точек в таблицу не записываются. Если вам необходимо табличное представление координат, выберите в меню "Вектор->Обработка геометрии" пункт "Экспортировать / добавить поле геометрии".