[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: TCL mapscript



On 2007.03.04 at 21:37:55 +0300, Pechnikov Alexey wrote:

> Можно пояснить, что следует делать? Есть исходники для mapserver-cgi, нужно 
> сделать tcl-mapscript - следует ли копать сишный код на предмет написания 
> функций для вызова из tcl или нужно писать тиклевский код для вызова 
> немодифицированных сишных функций? В принципе, сишный код вобрал в себя 
> множество проектов, таких, как shapelib и другие, да еще вызывает функции из 
> GDAL, proj (ну уж не говорю про gd) - что делать со всем этим хозяйством? 
> Оставлять вызовы в сишном коде или реализовывать на уровне tcl? То есть тикль 
> сам умеет с графикой управляться, вероятно, можно не таскать привязки к 
> libtiff, libpng, gd и прочие, но я не знаю, как это должно выглядеть на 
> практике.

Биндинг для 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.





Reply to: