[opengeodb] Neuentwicklung einer Geo-class in PHP

Peter Wendorff wendorff at uni-paderborn.de
Mit Aug 20 20:22:07 CEST 2008


Hi
Hab dazu 'n paar Kommentare...

prog wut schrieb:
> Wie versprochen hier mal ein kleines Beispiel:
> <?php.
>     error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
>    
>     // Klasse einbinden
>     require_once 'TMyMap.php';
>    
>     // Karte laden
>     $obj = new TMyMap('deutschland.gif');
wenn Du Daten für die Karte hast, wie z.B. deutschland.gif, dann wäre es 
schön, nur das Land angeben zu müssen, so dass sich die Klasse die 
Grafikdatei und die range-Parameter selbst sucht - denn das gehört ja 
normalerweise zusammen.
>                        
>     // Range setzen
>     $range = array();
>     $range['x']['min'] = 5.5201;
>     $range['x']['max'] = 15.0237;
>     $range['y']['min'] = 47.1615;
>     $range['y']['max'] = 55.0333;
hätte nicht ein 1D-Array gereicht? $range[xmin, ymin, xmax, ymax]
bei 2D würde ich wenigstens logischerweise nach Punkten sortieren - die 
also in der ersten Dimension unterscheiden, also $range[min][x], 
$range[min][y], $range[max][x], $range[max][y]
>    
>     $obj->setRange($range);
eine zusätzliche Methode der Form
    $obj->setRange($minx, $miny, $maxx, $maxy)
wäre sinnvoll.
>
>     // Eine location einzeichen an der Position lon, lat.
>     // Zusätzlich eingezeichneten Punkt über eine Imagemap verfügbar 
> machen
>     // Farbe des eingezeichneten Punktes ist col
>     $geo = array('lon'=>50.59,
>                            'lat'=>11.2,
>                            'write' =>     TMyMap::WRITE_AREASHAPE+
>                                                  TMyMap::WRITE_POINT+
>                                                  TMyMap::WRITE_DIV,
>                            'color' => array('r' => 1, 'g' => 255, 'b' 
> =>255),
>                            'areashape' => 
> array('href'=>'http://www.google.de', 'title'=>'google!', 'alt'=>'google')
>                           );
>                
>     $obj->writeGeoObj($geo);
s.o.
>    
>    
>     // Radien um die Location malen mit 20 und 40px Abstand
>     // Farbe der Radien bei color   
>     $ra= array('radius' =>
>                     array('size' => 20,
>                         'color' => array('r'=>255, 'g'=>0, 'b'=>0)
>                     ),
>                     array('size' => 40,
>                         'color' => array('r' => 0, 'g'=>255, 'b'=>0))
>             );
>     $obj->writeRadius($geo,$ra);
optional wären Abstände in (kilo)metern schön, die dann natürlich 
entsprechend umgerechnet werden müssten
>    
>    
>     // Bild auf Dateisystem schreiben, überschreiben wenn bereits 
> existiert.
>     $obj->saveImage("deutschland_ready.gif",true);
> ?>
>
>
>
> <html>
> <head>
> <title>dyn Map</title>
> <style>
>     .map_div
>     {
>         border:1px solid red;
>         position:absolute;
>         width:200px;
>         height:100px;
>     }
> </style>
> </head>
> <body>
> <!-- BEGINN AUSGABE DER KARTE -->
>
> <img src="deutschland_ready.gif" align="left"  usemap="#Landkarte" 
> border="0" />
> <?php
>     // Punkt vorhanden der ueber eine DIV positioniert wird
>     if($obj->getGeoObjTypes(TMyMap::WRITE_DIV))
>     {
> ?>
>         <?php
>             foreach($obj->getGeoObjAry(TMyMap::WRITE_DIV) as $geo)
>             {
>         ?>
>                 <div id="<?php echo md5($geo['lon'].$geo['lat']); ?>" 
> class="map_div" style="top:<?php echo $geo['div']['pos']['x']; 
> ?>px;left:<?php echo $geo['div']['pos']['x']; ?>px;">
MD5-Hashes können mit einer Ziffer beginnen, was als id in html nicht 
erlaubt ist - hier solltest Du einen Buchstaben voranstellen.

sinnvoll wäre außerdem, den html-code auch direkt aus der Klasse heraus 
erzeugen zu lassen - mit einer Methode wie
    echo $obj->getMapAsHTML();

>                     <?php echo $geo['y']."/".$geo['lat']; ?>
>                 </div>
>         <?php
>             }
>         ?>
> <?php
>     }
> ?>
>
>
> <?php
>     // Ist ein Punkt vorhanden für welchen eine Imagemap gezeichnet 
> werden soll
>     if($obj->getGeoObjTypes(TMyMap::WRITE_AREASHAPE))
>     {
> ?>
> <map name="Landkarte">
>     <?php
>         foreach($obj->getGeoObjAry(TMyMap::WRITE_AREASHAPE) as $geo)
>         {
>     ?>
>         <area shape="circle" coords="<?php echo 
> $geo['x'].",".$geo['y'].",".$geo['width']; ?>"
>               href="<?php echo $geo['areashape']['href']; ?>" 
> alt="<?php echo $geo['areashape']['alt']; ?>" title="<?php echo 
> $geo['areashape']['title']; ?>">
>     <?
>         }
>     ?>
> </map>
> <?php
>     }
> ?>
> <!--  ENDE AUSGABE DER KARTE -->
> </body></html>
Was vermutlich außerdem noch fehlt ist die Abfrage, ob die erstellten 
Punkte auch innerhalb der range liegen, über die Koordinaten außerhalb 
des Kartenbildes vermieden werden müssten.

Soweit fürs erste.
Gruß
jongleur