Re: TCL mapscript
> Биндинг для libproj я бы, например, сделал следующим образом:
>
> 1. Команда proj параметрами которой являются все имеющиеся в libproj
> опции проекций, возвращает команду tcl, которая является конвертером из
> проекции в проекцию (вроде как команда создания видгета в Tk возвращает
> команду, которая позволяет управлять этим видгетом).
>
> 2. Команда-преобразователь проекций имеет следующие подкоманды
>
> $converter point $x $y - возвращает список из двух элементов - координат
> после преобразования
> $converter revpoint $x $y - выполняет обратное преобразование
> (например, координат курсора мыши на экране в географические координаты)
>
> $converter polygon [ -step x ] $list
>
> преобразует список вида x y x y x y, аналогичный тому что возвращает
> команда coords canvas item polyline, в аналогичный список. Опция -step
> указывает, если длина какого-то отрезка больше указанной в целевой
> проекции, навставлять туда дополнительных точек, чтобы вместо прямой
> линии получить плавный изгиб (представьте себе что мы хотим построить
> координатную сетку в конической проекции для карты России. На входе у
> нас куча отрезков с начальной долготой 20 и конечной -170. Если мы туда
> не навставляем точек, результат не будет похож на ожидаемый - плавные
> дуги
>
> $converter raster хэндл-растра [-bbox {x1 y1 x2 y2} ] [-cellsize x]
>
> где растром может быть, например tk image или GD image или что там у нас
> является базовым способом представления растра в нашей системе.
>
> По умолчанию создается растр, вмещающий весь исходный растр после
> преобразования и с примерно равным размером ячейки. Опции -bbox и
> -cellsize позволяют эти умолчания изменить.
>
> Функция, реализующая эти операции пишется на C. Когда команда proj
> создает новую команду Tcl, она в качестве командной процедуры выставляет
> туда эту функцию, а параметры исходной и результирующей проекции
> передает через ClientData.
>
> Ну и естественно,
>
> $converter destroy, освобождающая ClientData и уничтожающая команду.
> Она же вызывается как CmdDeleteProc.
Спасибо, есть теперь над чем думать, буду смотреть в указанном направлении.
Еще вопрос есть, что можно выкинуть, а что нужно оставить. Например, есть
возможность проецировать вектора через proj, а можно пользоваться функциями
postgis. Последний вариант работает только если карты в postgresql хранятся,
зато возможности на порядок шире (например, можно найти объекты на одной
карте, которые поподают в выюранную область на другой, причем карты в разных
проекциях). На практике для города-миллионника карта с точностью до дома
имеет право жить только в базе, иначе слишком накладно с точки зрения
производительности (если сравнивать обработку из базе и из шейпфайлов).
Разумно ли ограничиться работой только с базой или стоит подумать и о
файловом хранении? То есть стоит думать о минимально необходимом или о полном
наборе возможностей?
Вот с такими функциями в дебиане mapserver конфигурится:
./configure --prefix=/usr --enable-debug --without-tiff --without-pdf --with-gd=/usr --with-freetype=/usr
\
--with-zlib=/usr --with-png=/usr --with-xpm=/usr --with-jpeg=/usr --with-gdal --with-ogr --with-proj --with-eppl
\
--with-postgis --with-wcs --with-wms --with-wmsclient --with-wfs --with-wfsclient --with-threads --with-geos
На практике требуется намного меньше, хотелось бы представлять, до какого
момента более скромная версия будет интересна сообществу, а после какого -
только мне лично.
Reply to: