[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)