Hallo zusammen,
dies ist, glaub ich, eine sehr spezielle Frage, aber vielleicht hat ja jemand etwas ähnliches in anderem Zusammenhang gesehen.
Also ich arbeite gerade an einer GIS-Anwendung (Geografisches Informations System) und verwende hierzu Perl/Tk bzw., da ich mir noch nicht ganz sicher bezüglich des Toolkits bin, Perl/Tkx. Zu diesem Zweck lade ich Esri-Shapefiles mit Hilfe des Moduls Geo::ShapeFile (ich habe auch Geo::Shapelib versucht, das Ergebnis ist das gleiche). Die einzelnen Shapes (Polygone) durchlaufe ich, extrahiere die Koordinaten und gebe Sie in das Tk::Worldcanvas bzw. Tkx::Canvas aus (siehe Code-Fragment unten). Das Problem liegt nun darin, dass einige Linien erscheinen, die es eigentlich nicht geben sollte, egal welche Shape-Bibliothek bzw. welches der beiden Canvas-Widgets ich verwende. Ich habe mit anderen Programmen gegengechecked (z. B. OpenJump) und dabei festgestellt, dass die Linien tatsächlich nicht vorkommen. Daher frage ich mich, ob ich in der Darstellungs-Routine einen Fehler mache.
Vielen Dank für eure Hilfe
Helmut
Hier der Code zum Lesen und Darstellen der Dateien mit Geo::ShapeFile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
### Funktion zum Darstellen eines Shapefiles
### Param: objShape - Shape-Objekt
### Param: objCanv - WorldCanvas-Objekt
sub displayPolyShape{
my $objShape = shift;
my $objCanv = shift;
my $foreColor = shift;
my $backColor = shift;
# Shapefile durchlaufen
for (my $index = 1; $index <= $objShape->shapes(); ++$index) {
# Referenz auf Shapeobjekt holen und dereferenzieren
my $shape = $objShape->get_shp_record($index);
my %shape = %{$shape};
#use Data::Dumper;
#print Dumper %shape, "\n";
# Koordinaten
my @koords = ();
# Punkte holen
my @punkte = @{$shape{'shp_points'}};
foreach (@punkte) {
# Koordinaten dereferenzieren
my $x_koord = ${$_}{'X'};
my $y_koord = ${$_}{'Y'};
if($x_koord && $y_koord){
push(@koords, $x_koord, $y_koord);
}
}
# Polilyne zufügen
my $pLine = $objCanv->createPolygon(@koords,
-outline => $foreColor,
-fill => $backColor,
-width => 0.01);
# Tags anfügen
### TODO
}
}