[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