среда, 16 июля 2008 г.

Тестирование spatialite-2.1

Alessandro Furieri прислал письмо с сообщением о выходе альфа-версии spatialite-2.1 со множеством приятных новшеств:


I've just released SpatiaLite 2.1-alpha
[OGC Spatials for SQLite]

http://www.gaia-gis.it/spatialite-2.1

This is not a stable release, and is simply
an "ad interim" one:

- now supporting Libiconv (full implementation
for locale charsets and Unicode UTF-8)

- now including an useful GUI management tool
(very similar to mysql-query-browser and
pgAdmin3)
** There are lots of GUI tools already
** supporting SQLite, but none of them
** allows dynamic extension loading,
** so they cannot be used for Spatial
** processing

D. Richard Hipp announced that SQLite's new
version [3.6] will officially support RTree
Spatial Index; public release is planned in
the next few days.

This explains why SpatiaLite 2.1-alpha is
a short-lived release; the stable SpatiaLite 2.1
will be released in August, so to include
sqlite-3.6 and the final, stable implementation
for SQLite's RTree
SpatiaLite 2.1-alpha still includes sqlite-3.5.9,
and consequently uses the experimental version of
RTree Spatial Index


Раз так, то надо протестировать, чтобы в августе получить качественный релиз. Итак, запускаем GUI и выбираем в меню подключение шейпфайла. Беру слой с домами по Н. Новгороду (более 40 тысяч объектов), кодировку указываю cp-1251. Автоматически составляется следующий sql-запрос, который и выполняю:

CREATE VIRTUAL TABLE nn_ppab
USING VirtualShape('/var/www/mbg/mobigroup.ru/res/maps/map_ru_52_nn/nn_ppab',
CP1251, -1)


Проверяем:

select count(*) from nn_ppab;
41608

select * from nn_ppab limit 1;
1 BLOB sz=260 GEOMETRY 1.0000 БОГДАНОВИЧА УЛИЦА жилой 7 Нижегородский 7 БОГДАНОВИЧА УЛИЦА 7

select * from nn_ppab where street='БОГДАНОВИЧА' limit 10;
1 BLOB sz=260 GEOMETRY 1.0000 БОГДАНОВИЧА УЛИЦА жилой 7 Нижегородский 7 БОГДАНОВИЧА УЛИЦА 7
2 BLOB sz=132 GEOMETRY 2.0000 БОГДАНОВИЧА УЛИЦА жилой 7 корп.2 Нижегородский 7 к.2 БОГДАНОВИЧА УЛИЦА 7 к.2
3 BLOB sz=260 GEOMETRY 3.0000 БОГДАНОВИЧА УЛИЦА жилой 7 корп.1 Нижегородский 7 к.1 БОГДАНОВИЧА УЛИЦА 7 к.1
6 BLOB sz=132 GEOMETRY 6.0000 БОГДАНОВИЧА УЛИЦА жилой 1 корп.1 Нижегородский 1 к.1 БОГДАНОВИЧА УЛИЦА 1 к.1
35665 BLOB sz=164 GEOMETRY 35675.0000 БОГДАНОВИЧА УЛИЦА жилой 1 корп.2 Нижегородский 1 к.2 БОГДАНОВИЧА УЛИЦА 1 к.2
37953 BLOB sz=260 GEOMETRY 37963.0000 БОГДАНОВИЧА УЛИЦА жилой 1 Нижегородский 1 БОГДАНОВИЧА УЛИЦА 1


Как видим, русский язык работает, информация из шейпфайла доступна с помощью sql-запроса.

Попробуем выполнить пространственные запросы. Для этого нужно загрузить файл init_spatialite.sql с описаниями координатных систем.


select AsText(Geometry) from nn_ppab where street='БОГДАНОВИЧА' limit 1;
POLYGON((442528.805533 6238209.748202, 442618.534136 6238207.367538, 442619.050719 6238209.3142, 442628.264127 6238209.891515, 442628.11679 6238213.850828, 442644.874392 6238213.5352, 442644.684053 6238197.728526, 442642.240754 6238196.709443, 442641.069658 6238190.84432, 442619.145452 6238191.509989, 442618.882569 6238193.507226, 442528.363387 6238196.790178, 442528.805533 6238209.748202))

select AsText(Transform(SetSRID(Geometry,28468),4326)) from nn_ppab where street='БОГДАНОВИЧА' limit 1;
POLYGON((44.072601 56.261807, 44.07405 56.261796, 44.074057 56.261814, 44.074206 56.26182, 44.074203 56.261856, 44.074473 56.261855, 44.074474 56.261713, 44.074434 56.261704, 44.074417 56.261651, 44.074063 56.261654, 44.074058 56.261672, 44.072597 56.26169, 44.072601 56.261807))



Как видим, преобразование координат работает.

понедельник, 14 июля 2008 г.

sqlite в ГИС - продолжение

Приятная новость - индекс R-tree входит в состав версии 3.6.0 (впрочем, и сейчас можно скомпилировать загружаемую библиотеку для поддержки этого индекса, и многие разработчики так и делают, разве что на "маках" есть какие-то проблемы, но эта ОСь мне лично до лампочки), которая будет выпущена в среду. Вот что по этому поводу написал в рассылку сам автор SQLite:


The current plan is to release SQLite version 3.6.0 on Wednesday,
2008-07-16.

Draft documentation on version 3.6.0 is available at http://www.sqlite.org/draft/doc/index.html
. Please pay particular attention to:

http://www.sqlite.org/draft/doc/35to36.html

If you sees any problems with the upcoming release, or finds omissions
or errors or ambiguities in the documentation, now would be a very
good time to speak up. Thank you for your attention.

D. Richard Hipp
drh@hwaci.com


Вот отсюда http://www.gaia-gis.it/spatialite-2.0/index.html можно взять аналог PostGIS для SQLite. Кстати, этот аналог обладает интересным свойством - с его помощью можно подключать шейпфайлы к базе и работать с ними. А можно просто импортировать шейпы и, разумеется, экспортировать геоданные в этот формат.
Список функций см. на этой странице
SpatiaLite SQL functions reference list

В настоящий момент индекс R-tree поддерживает только значения типа float, однако ведется дискуссия по поводу включения поддержки типа int - патч предложен, однако пока неясно, как именно переключаться между этими типами. Выбирать тип на этапе компиляции не выход, поскольку в одной БД могут понадобиться оба типа (например, для периода времени и координат), этот аргумент уже озвучен.

Так что поздравляю всех, связанных с миром ГИС, со сменой парадигмы - легкие и быстрые решения наконец-то пришли на смену неповоротливым монстрам эпохи динозавров, то есть, я хотел сказать, мэйнфреймов.

В скором времени займусь обработкой пространственных данных в SQLite, если будет время, расскажу об этом.

(C) Alexey Pechnikov aka MBG, mobigroup.ru