24 мая 2011

Common Lisp. Первый блин.

На базе библиотеки cl-wkb сделал cl-ewkb.

Итак, для чего же нужна данная библиотека? Начну сдалека, придумали как-то люди хранить геометрические объеты в стоблцах реляционных баз данных. Для ввода данных придумали два формата текстовый и бинарный, для человека и компьютера соответственно. Эти форматы используются для вставки, запроса данных в СУБД. Сама же СУБД как хочет так и хранить геометрические данные. Определили набор геометиреческих примитивов:
  • Точка
  • Линия
  • Выпуклый многоугольник с дырками (FIXME)
  • Много-точек
  • Много-линий
  • Много-многоугольников
  • Много-всякого
Вот как человек может вставить такие данные:

INSERT roads(the_geom) VALUES (ST_GeometryFromText('LINESTRING(0 0, 1 1, 2 3, 5 3, 10 8'));

А вот так можно их получить обратно:

SELECT ST_AsText(the_geom)  FROM roads;

Для компьютерной же обработки предусмотрены слегка другие функции:

INSERT roads(the_geom) VALUES (ST_GeomFromWKB(bytes));

А вот так можно их получить обратно:

SELECT ST_AsBinary(the_geom)  FROM roads;

Самым, конечно знаменитым проектом использующим GIS СУБД является openstreetmap (несмотря на xml обмен данными между базой и пользователями). В openstreetmap используется Postgresql/PostGIS.

Так вот этот PostGIS позволяет хранить не только 2d геометрические объекты, но как Вы уже догадались и 3d и 4d.

Для того чтобы Вы могли получить из СУБД Postgresql эти объекты к себе в common lisp, нужно просто сделать:

(require :postmodern)
(use-package :postmodern)

(require :cl-ewkb)
(use-package :cl-ewkb)

(decode (caar (query (:select (:ST_AsEWKB "LINESTRING(1 2 1, 2 3 4)")))))

Вуаля.

P.S. Ах да, asdf пакет-то находится по адресу: https://github.com/filonenko-mikhail/cl-ewkb

Комментариев нет:

Отправить комментарий