[Mapserver-DE] Probleme mit $shape->bounds bei selbstproduzierten Shapes (+ Workaround)
Ludwig Kniprath
ludwig at kni-online.de
Fre Nov 10 15:21:27 CET 2006
Hallo Liste,
nach Recherche diverser Foren offenbar ein älteres Problem, aber leider
noch keine Lösung innerhalb PHP-Mapscript:
Bounding-Box von selbsterzeugten Shapes
Ziel:
Zoom auf ein Shape, welches als GET-Variable im WKT-Format übergeben wird
Code (vereinfacht):
$zoom_shape = ms_shapeObjFromWkt($_GET['zoom_shape_wkt']);
$bounds = $zoom_shape->bounds;
$map->setExtent($bounds->minx, $bounds->miny, $bounds->maxx, $bounds->maxy);
Das Problem liegt darin, dass die Eigenschaft "bounds" bei der
Initialisierung eines Shapes offenbar nicht automatisch berechnet wird
und die Initialisierungswerte minx/miny/maxx/maxy -1/-1/-1/-1 für die
Funktion setExtent natürlich nicht geeignet sind.
Hinweis 1: Die in PerlMapScript vorhandene Funktion setBounds() gibt's
unter PHP bisher nicht
Hinweis 2: Die Methode $shape->boundary() ergibt leider ebenfalls
-1/-1/-1/-1
Hinweis 3: der Bug tritt bei normalen ("nicht-selbst-produzierten")
Shapes nicht auf
Hinweis 4: Abweichend von der Dokumentation ist die Eigenschaft
$shape->bounds *nicht* readonly, dadurch kann man den mit getBoundsRec
(s.u.) für ein einzelnes Shape ermittelten Wert für das nachträgliche
Setzen der Eigenschaft verwenden.
Hinweis 5: nach dem manuellen Setzen dieser Eigenschaft liefert
$shape->bounds korrekte Werte, $shape->boundary() aber immer noch
-1/-1/-1/-1
Frage an die Liste:
Gibt's zu u. g. Workaround eine Alternative?
Wird die m. E. fehlende Funktionalität irgendwann in phpMapscript
nachgerüstet?
Gruß
Ludwig
--------------------------------
selbstgestrickter Workaround:
public static function getBoundsRec($shapes)
{
$point_x = array();
$point_y = array();
foreach($shapes as $shape)
{
$numlines = $shape->numlines;
for($lc = 0; $lc < $numlines; $lc++)
{
$this_line = $shape->line($lc);
$numpoints = $this_line->numpoints;
for($pc = 0; $pc < $numpoints; $pc++)
{
$this_point = $this_line->point($pc);
$point_x[] = $this_point->x;
$point_y[] = $this_point->y;
}
}
}
$bounds_rec = ms_newRectObj();
$bounds_rec->minx = min($point_x);
$bounds_rec->miny = min($point_y);
$bounds_rec->maxx = max($point_x);
$bounds_rec->maxy = max($point_y);
return $bounds_rec;
}
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)