воскресенье, 24 мая 2009 г.

Релиз Spatialite 2.3

На самом деле, релиз вышел уже энное время назад, но только сегодня я добрался до него. Итак, занимаюсь валидацией исходников. Бета-версию Spatialite 2.3 мне присылал автор, я ее интегрировал в дерево исходников SQLite в виде набора модулей, в том числе поправил некоторые баги, в том числе переполнение int в модуле VirtualText, который я много где использую (а обнаружил ошибку, когда начал загружать с помощью этого модуля телефонные номера в биллинг - по стандарту номера бывают до 15-ти знаков, и вот тут-то и нарисовались аккуратно прикопанные грабли). Как оказалось, этот самый неприятный баг автор почему-то забыл поправить и я снова отправил ему сообщение об этом прискорбном факте (или даже инциденте, уж больно баг неприятный, сразу и не заметить, ведь проблема не в коде, а в логике).

Итак, к настоящему моменту я проверил код VirtualText, VrtualShape, iconv (автор его по-другому называет, но для меня, черт побери, имя файла gg_utf8 и название функций с префиксом gaia* отнюдь не очевидно, но на эту тему мы еще с автором пободаемся). Первый и последний модуль уже включены в сборку SQLite 3.6.14.2, доступную в моем репозитории, сообщения о багах отправлены автору. Второй модуль тоже в порядке, но есть мысль сделать отдельный пакет с расширением Spatialite. Сам автор делает в точности наоборот - собирает SQLite как часть Spatialite, но с дебиановской системой пакетов это никак не вяжется, а еще получается, что яйцо учит курицу, ведь как раз Spatialite создан как расширение к SQLite. Ладно, предыдущую версию Spatialite я целиком включил в SQLite (разбив на модули), но Spatialite растет на глазах и, похоже, имеет право на отдельный пакет. Из минусов такого решения отмечу, что придется явно подгружать дополнительную библиотеку для работы с ГИС-данными. Ну и еще признаюсь, что VirtualText я по-прежнему оставлю модулем SQLite - без этого расширения как без рук.

Spatialite 2.3 требует для работы geos 3.1.0, который есть в sid. Ну, раз требует, сделал бэкпорт, который также можно взять у меня в репозитории. Из приятностей - появилась поддержка EXIF GPS, VirtualNetwork, VirtualFdo. И в самом деле, проект растет. Если предыдущая версия "догоняла" PostGIS, то новая версия предлагает собственные уникальные функции. А про скорость работы и говорить не приходится. Также замечу, что код Spatialite по-прежнему сделан качественно и легко читаем, притом взаимодействие непосредственно с SQLite занимает буквально строчки - конечно, это достигается благодаря движку SQLite, но тем не менее весьма радует. Если мои читатели помнят, от PostgreSQL я отказался как раз в результате монстрообразности кода самого постгреса и его расширений в частности (в своих проектах до сих пор использую эту СУБД, но расширения к ней писать не желаю, поскольку тратить тучу времени на описание взаимодействия с движком СУБД имхо потеря времени в чистом виде).

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

Как я сейчас обнаружил, в debian unstable уже есть пакет со Spatialite. Причем мантейнер пакета тот же, что и у AOLServer -это очень даже хорошо, поскольку мантейнер весьма адекватный и реагирует быстро. Отправил ему сообщение насчет неисправленного бага в VirtualText, а себе сделал бэкпорт пакета. Заодно собрал новый gdal 1.6.1. В gdal 1.7.0 обещают поддержку Spatialite, только непонятно, когда же он выйдет.

Ставим так
sudo aptitude install libspatialite2

Теперь в шелле SQLite можно загрузить расширение командой:
.load /usr/lib/libspatialite.so.2.0.3

Да, именно *.so.2.0.3, в бинарях с офсайта нумерация точно такая же. Впрочем, это мелочь, не буду пока обращать внимания.

Выглядеть это должно примерно так:

$ sqlite3 track.db
SQLite version 3.6.14.1
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .load /usr/lib/libspatialite.so.2.0.3
SpatiaLite version ..: 2.3.0 Supported Extensions:
- 'VirtualShape' [direct Shapefile access]
- 'VirtualText' [direct CSV/TXT access]
- 'VirtualNetwork [Dijkstra shortest path]
- 'RTree' [Spatial Index - R*Tree]
- 'MbrCache' [Spatial Index - MBR cache]
- 'VirtualFDO' [FDO-OGR interoperability]
- 'SpatiaLite' [Spatial SQL - OGC]
PROJ.4 Rel. 4.6.1, 21 August 2008
GEOS version 3.1.0-CAPI-1.5.0


Получил ответ от автора Spatialite, он посмотрел мою тестовую базу и порадовал сообщением, что в его коде ошибок не обнаружено. Есть проблема обработки в GDAL сгенерированной в ogr2ogr геометрии в представлении WKT.


Any problem you noticed simply arise because inside the "tracks"
table there is a "foolish" geometry, corresponding to the row
identified by OGC_FID=3
Let you try:

SELECT NumPoints(GeomFromText(WKT_GEOMETRY)) FROM tracks;

As you can easily notice, this row stores a single vertex:

MULTILINESTRING ((44.036190015999999 56.322677638000002))

so, this is one is a genuine degenerated LINESTRING:
actually, this one is a POINT.


Таким образом, вопрос лишь в дополнительной проверке данных.


Получил ответ на очередное письмо автору и порадовался как исправлению найденных проблем, так и живому юмору, с которым написано письмо. Итак, внесены следующие доработки:

1. Добавлена проверка вырожденных WKT геометрий: для LINESTRINGs [<2 pts] и
для RING [<4 pts] все функции семейства GeomFromText() корректно возвращают NULL Geometry.

2. Ффункция gaiaIsResevedSqlName() исключена.

3. Модуль "my_text_module" переименован в "virtualtext_module".

4. Исправлена проблема с целочисленным переполнением в модуле VirtualText.

Изменить префикс gaiaConvertToUTF8() автор не согласился, поскольку этот префикс принят для всех функций проекта. Не могу не согласиться, хотя при включении кода модуля VirtualText в SQLite название выглядит немного странно :-)

Новую версию [rev.15] можно взять здесь (вскоре я соберу обновленный deb-пакет):

svn co https://www.gaia-gis.it/svn/libspatialite libspatialite-svn

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

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

sim комментирует...

классные новости, спасибо что занимаетесь этим. За spatialite будущее.

Печников Алексей комментирует...

Ну почему же только будущее :-) Уже и сейчас можно использовать, например, допиленный VirtualText у меня работает в некоторых проектах и планирую на него перевести все операции импорта csv-файлов.

Что касается непосредственно spatial функций, их набор довольно большой, по большому счету остается протестировать хорошенько и баги поправить.

Пока есть некоторые технические проблемы, например, Spatialite в тип MULTILINESTRING запихивает единственную точку, в результате чего gdal сегфолтится. Часть функций не работают с WKT. В общем-то основные проблемы я уже за вечер раскопал, если автор откликнется прежде, чем у меня очередной завал по работе случится (по работе мне ГИСы совершенно не нужны, поскольку ни один российский заказчик не готов за это платить), то разберемся и поправим. В прошлый раз, когда я добрался до Spatialite, автор принял баг-репорты и патчи и переделал систему сборки и проч. , если в этот раз получится так же договориться, скоро можно будет и на продакшен ставить. Пора бы мне свои трэки в порядок привести, впрочем, я уже об этом писал.

Avenger комментирует...

Уважаемый Алексей, слежу за вашим проектом и за Spatialite уже давно. Не могли бы вы прояснить сроки выхода следующий версии - 2.4 ?


(C) Alexey Pechnikov aka MBG, mobigroup.ru