среда, 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))



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

2 комментария:

Алексей (rewritoff) комментирует...
Этот комментарий был удален администратором блога.
Анонимный комментирует...

Я, волею судеб, пишу свою универсальную ГИС. Сначала хранил данные только в Оракле (Spatial). Ну это я для начала решил реализовать. Тормоза не детские, индексы не помагают. Конечно нужно поддерживать локальные файлы. Всякого рода shape'ы давно устарели и я тоже наткнулся на Sqlite. По своему весьма неплохая вещь. Потом уже наткнулся на этот блог. Вот хочется поделиться своим опытом. После перехода на SQLite скорость конечно возросла, но все равно явно не дотягивает до MapInfo например. Где тоже используется некая своя файловая СУБД. Короче говоря я принял решение писать свою однофайловую, транзакционную, отказоустойчиваю СУБД. Кстати с многопользовательностью у SQLite тоже все нехорошо. Если говорить прямо - ее нет. Если инсертит один поток, второй уже ничего менять не может. Это не есть хорошо. Во вторых семантика и геометрия должны лежать в разных страницах или файлах. Чего SQLite конечно же не предусматривает. И так далее. Сейчас додумываю архитектуру и помальньку начинаю реализовывать. С SQL вроде проблем быть особых недолжно, в ГИС я уже кое-чего реализовал можно будет использовать. Понимаю что замахнулся, но те же Панорама ObjectLand и другие пошли тем же путем. Думаю не буду жадничать, как появится что рабочее буду выкладывать в web бесплатно. Правда исходников не обещаю, будут использоваться проприетарные компоненты (SQL-парсер я сам не писал :)
Скажите где вы используете SQLite? свой ГИС проект? Может наладить обмен идеями.


(C) Alexey Pechnikov aka MBG, mobigroup.ru