понедельник, 25 мая 2009 г.

Well-known text (WKT) и Tcl

Well-known text - стандартный формат предоставления геоинформации во многих системах, в том числе, с этим форматом умеют работать OGR, Spatialite, PostGIS. Неплохо бы с этим форматом уметь и напрямую работать, из тиклевой программы. А реализовать это можно вот так:

1. Преобразование во вложенные тиклевские списки:

proc WKT_read {wkt} {
return [string map {, " " \
( " {" \
, " " \
) "} " \
} $wkt]
}

WKT_read {POINT(6 10)}
POINT {6 10}

WKT_read {LINESTRING(3 4,10 50,20 25)}
LINESTRING {3 4 10 50 20 25}

WKT_read {POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2))}
POLYGON { {1 1 5 1 5 5 1 5 1 1} {2 2 3 2 3 3 2 3 2 2} }

WKT_read {MULTIPOINT(3.5 5.6,4.8 10.5)}
MULTIPOINT {3.5 5.6 4.8 10.5}

WKT_read {MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))}
MULTILINESTRING { {3 4 10 50 20 25} {-5 -8 -10 -8 -15 -4} }

WKT_read {MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)),((3 3,6 2,6 4,3 3)))}
MULTIPOLYGON { { {1 1 5 1 5 5 1 5 1 1} {2 2 3 2 3 3 2 3 2 2} } { {3 3 6 2 6 4 3 3} } }

WKT_read {GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))}
GEOMETRYCOLLECTION {POINT {4 6} LINESTRING {4 6 7 10} }

WKT_read {POINT EMPTY}
POINT EMPTY

WKT_read {MULTIPOLYGON EMPTY}
MULTIPOLYGON EMPTY


2. Работа с полученными вложенными списками:

proc MULTILINESTRING {mline} {
if {$mline eq {EMPTY}} return
foreach line $mline {
puts "new line:"
LINESTRING $line
}
}
proc LINESTRING {line} {
if {$line eq {EMPTY}} return
foreach {x y} $line {
puts "x: $x, y: $y"
}
}

MULTILINESTRING { {3 4 10 50 20 25} {-5 -8 -10 -8 -15 -4} }
new line:
x: 3, y: 4
x: 10, y: 50
x: 20, y: 25
new line:
x: -5, y: -8
x: -10, y: -8
x: -15, y: -4

LINESTRING {3 4 10 50 20 25}
x: 3, y: 4
x: 10, y: 50
x: 20, y: 25


Представленные реализация MULTILINESTRING и LINESTRING умеют работать только с двумерными координатами, однако аналогично можно написать версию для обработки трехмерных координат. А представленный выше код подойдет, к примеру, для обработки трэков с gps-навигатора.

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


(C) Alexey Pechnikov aka MBG, mobigroup.ru