[Mapserver-DE] point-layer mit mysql, php/mapscript und versch. symbolen?

Katja Friebel k.friebel at gmx.de
Don Nov 30 17:20:38 CET 2006


Kai Behncke wrote:

>On Fri, 17 Nov 2006 01:24:29 +0100, Katja Friebel wrote
>  
>
>>hallo liebe liste,
>>
>>langsam weiß ich mir keinen rat mehr und der kopf raucht. aller 
>>anfang ist schwer... kann mir vielleicht jemand weiterhelfen?
>>
>>ich halte in mysql eine zwei tabellen vor, in der einen befinden 
>>sich einrichtungen mit strasse, hausnummer, in der anderen die 
>>zugehörigen koordinaten. mittels php/mapscript erzeuge ich die 
>>punkte in einem leeren (point) layer des mapfiles. soweit kein 
>>problem (dazu gibt es ja genügend beispiele). dabei wird aber nur 
>>die erste, im layer definierte klasse visualisiert. die objekte 
>>sollen aber je nach klassifizierung in der tabellenspalte 
>>"kategorie" (apotheken, restaurants etc.) mittels eines 
>>entsprechenden symbols (oder eines gif-bildes) dargestellt werden.
>>
>>ist es möglich, für diese problematik die klassen im mapfile zu 
>>definieren? wenn ja, wie kann ich von mapscript darauf zugreifen?
>>oder muß ich den style in mapscript festlegen (da scheint es aber 
>>nicht so viele möglichkeiten zu geben)?
>>
>>wäre über hilfe sehr dankbar...! mit grüßen aus dem nächtlichen berlin
>>
>>hier der code:
>>
>><?php
>>dl('php_mapscript_48.dll');
>>//...
>>function GetMobidatTable() {
>>
>>    include("db_connect1.inc");
>>    mysql_connect($host, $user, $pwd) or die('Verbindungsaufbau fehlgeschlagen!');
>>    mysql_select_db(mobidat) or die ("Datenbank konnte nicht ausgewählt werden");
>>
>>    if ($_POST['spalte'] == "") {
>>        $sql="SELECT * FROM treptow m, hausnr h WHERE m.Strasse = h.Strasse && m.Hausnr = h.Hausnr GROUP BY 				(m.Strasse)";   
>>        }
>>    else {   
>>        $sql = "SELECT * FROM treptow m, hausnr h            
>>                  WHERE m.Kategorie LIKE '" . $_POST['spalte'] . "' 
>>                  && m.Strasse = h.Strasse
>>                  && m.Hausnr = h.Hausnr GROUP BY (m.Strasse)";   
>>        }
>>
>>    $result=mysql_query($sql);
>>    echo mysql_error();
>>    $i = 0;
>>    while ($row = mysql_fetch_array($result,MYSQL_NUM) ) {
>>        $qresult[$i] = $row;
>>        $i++;
>>    }
>>    return $qresult;
>>}
>>
>>//---------------------------------------------------------
>>// add locations to map layer 'einrichtungen'
>>
>>function AddPoints ($map, $qresult) {
>>
>>    $this_layer = $map->getLayerByName('einrichtungen');
>>
>>    $i = 0;
>>    foreach ($qresult as $row) {
>>        $poi[$i] = ms_newPointObj();
>>        $ln[$i] = ms_newLineObj();
>>        $shp[$i] = ms_newShapeObj(MS_SHAPE_POINT);
>>        $poi[$i]-> setXY($row[22],$row[23]);
>>        $ln[$i]->add($poi[$i]);
>>        $shp[$i]->add($ln[$i]);
>>        $shp[$i]->set(index,$row[0]);
>>        //$classPlanetarium=ms_newClassObj($this_layer);
>>        //$classPlanetarium = $this_layer->getClass(1);
>>        $this_layer->addFeature($shp[$i]);
>>        $i++;
>>    }
>>    return;
>>}
>>//---------------------------------------------------------
>>// verschiedene Symbole für layer 'einrichtungen' vergeben
>>
>>function SetSymbols ($map) {
>>
>>    $layer = ms_newLayerObj($map);
>>    $layer = ms_newLayerObj($map);
>>    $layer = $map->getLayerByName('einrichtungen');
>>    $layer->classitem ='Kategorie';
>>    $classPlanetarium = $layer->getClass(1);
>>    //$classPlanetarium->ms_newClassObj($layer);
>>    $classPlanetarium->name = 'Planetarium';
>>    $classPlanetarium->setExpression('Planetarium');
>>    //$planetariumStyle= $classPlanetarium->getStyle(0);
>>    //$planetariumStyle->$Symbol->set("filled", MS_TRUE);
>>    //$planetariumStyle->$Symbol->set("sizex", 1);
>>    //$planetariumStyle->$Symbol->set("sizey", 1);
>>}
>>//...
>>$map = ms_newMapObj($map_path.$map_file);
>>//...
>>// Ergebnisse der DBabfrage einbinden
>>$qresult = GetMobidatTable();
>>AddPoints ($map, $qresult);
>>//SetSymbols ($map);
>>
>>//...
>>?>
>>
>>der layer im mapfile:
>>LAYER
>>    NAME         einrichtungen
>>    TYPE         POINT
>>    STATUS       ON
>>    CLASSITEM    "Kategorie"
>>
>>    CLASS
>>        NAME 'Apotheke'   
>>        EXPRESSION 'Apotheken'
>>        SYMBOL    "Apotheke"
>>        SIZE     20
>>        TEMPLATE     "query.html" 
>>    END #class
>>    CLASS
>>        NAME 'Planetarium'
>>        EXPRESSION 'Planetarien/Sternwarten'
>>        SYMBOL 'stern'
>>        COLOR    32 32 32 
>>        SIZE     20
>>        TEMPLATE     "query.html"
>>    END #class
>>END # layer
>>
>>    
>>
>Hallo Katja,
>mittels folgendem Prinzip funktioniert es:
>In der mysql-Tabelle, in welcher auch die Punktkkordinaten liegen, liegt auch
>der Kategorieeintrag (z.B. Restaurant, Museum, etc.).
>
>Im Mapfile lautet der Eintrag zu dem poi-Layer einfach:
>
>LAYER
>     NAME "poi"
>     STATUS on
>     TYPE point	
>     LABELCACHE on
>     TOLERANCEUNITS miles
>
>END
>
>Entscheidend ist dann natürlich das php/Mapscript-Skript.
>Dort wird ja zunächst die Mysql-Tabelle eingelesen.
>
>Man braucht im Prinzip nur die Funktion AddPoint()->
>
>function AddPoints ( $map, $qresult ) {
>
>
>     $this_layer = $map->getLayerByName('poi');
>
>     $i = 0;
>     foreach($qresult as $row) {
>        $poi[$i] = ms_newPointObj();
>       $ln[$i] =  ms_newLineObj();
>       $shp[$i] = ms_newShapeObj(MS_SHAPE_POINT);
>        $poi[$i]->setXY($row[3],$row[2]);
>    $ln[$i]->add($poi[$i]);
>     $shp[$i]->add($ln[$i]);
>        $shp[$i]->set(index, $row[0]);
>
>/*Interessant wirds dann hier. Wenn der Kategorieeintrag "Museum" lautet,
>dann wird im Layer poi ein Klassenobjekt "Museum" angelegt, in dieser 
>ein Styleobjekt, und dieses erhalt das Symbol "Museum".
>Die angelegten Punkte werden dann mit diesem Symbol dargestellt.*/
>
>
>        if ($row[7]=="Museum") {
>      
>          $classmuseum=ms_newClassObj($this_layer);
>          $classmuseum->set ("name",Museum);
>    $museumstyle=ms_newStyleObj($classmuseum);
>$museumstyle->set("symbolname", museumssymbol);
>$this_layer->addFeature( $shp[$i] );
>}
>
>/* Wenn irgendwo die Kategorie "Restaurant" auftaucht, dann wird einfach ein
>komplett neuer Layer erstellt, dieser enthält auch ein Klassenobjekt ->
>Styleobjekt -> Symbolnamen.
>Die Punktdaten werden dann mit unterschiedlichen Symbolen dargestellt.
>
>       if ($row[7]=="Restaurant") {
>          $that_layer=ms_newLayerObj($map);
>          $that_layer->set('status',MS_ON);
>          $that_layer->set ("name",restaurant);
>          $that_layer->set ("type",point);
>          $classres=ms_newClassObj($that_layer);
>          $classres->set ("name",restaurant);
>    $resstyle=ms_newStyleObj($classres);
>$resstyle->set("symbolname", cup);
>
>		$that_layer->addFeature( $shp[$i] );
>}
>
>
>
>	
>   
>        $i++;
>     }
>
>     return;
>
>} // end AddPoints
>
>Das angekündigte Tutorial wird wohl noch eine Woche länger brauchen.....
>
>Viele Grüße, Kai
>
>--
>Dipl.-Geogr. Dipl.-Umweltw. Kai Behncke
>
>Institut für Geoinformatik und Fernerkundung (IGF)
>Universität Osnabrück
>Kolpingstr. 7
>49074 Osnabrück
>
>Raum: 01/308
>Tel.: +49 541 969-4450
>E-Mail: mailto:kbehncke at igf.uni-osnabrueck.de 
>Web:  http://www.igf.uni-osnabrueck.de
>
>_______________________________________________
>Mapserver-DE mailing list
>Mapserver-DE at freegis.org
>https://freegis.org/mailman/listinfo/mapserver-de
>
>  
>
Hallo Kai,
vielen Dank für deine Hilfe!
Habe mittlerweile alternativ das Tutorial von Roberto Colonello 
(http://www.parsec.it/tutorials/mapserver_add_icons.htm) bei mir zum 
Laufen gebracht :-)
Dabei enthält das mapfile keinen "POI"-Layer (einrichtungen). Mein 
php-Skript habe ich beigefügt.
Da ich sehr viele Kategorien vorliegen habe, ist das vermutlich die 
kürzere Variante. Damit entfällt allerdings die Möglichkeit der 
Symboldefinition über den Mapserver, was in meinem Fall aber nicht 
relevant ist, und die Query. Werde daher jetzt auch gleich dein Skript 
testen und dann schauen, welche Variante für die geplante Anwendung 
besser passt.

Viele Grüße, Katja

<?php
dl('php_mapscript_48.dll');

//Beispiel zu finden unter:
//http://www.parsec.it/tutorials/mapserver_add_icons.htm

define("img_WIDTH", 0);
define("img_HEIGHT", 1);
define("img_TYPE", 2);

// Path defaults
$map_path="d:/ms4w/apache/htdocs/mobidat_php/test/"; 
$map_file="berlin.map"; 
$imgpath="d:/ms4w/tmp/";

function AddImagesToMap($mapurl,$map, $imgpath)
{ 
    // CONNECT TO DATABASE
    include("../db_connect1.inc");
    mysql_connect($host, $user, $pwd) or die('Verbindungsaufbau 
fehlgeschlagen!');
    mysql_select_db(mobidat) or die ("Datenbank konnte nicht 
ausgew&auml;hlt werden");
  
    // PATH WHERE TO FIND THE MAP IMAGE GENERATED BY MAPSERVER
   $mapimagepath = $imgpath.$mapurl;
   $mapdim = GetImageSize($mapimagepath);
   $coords_map_width = $map->extent->maxx - $map->extent->minx;
   $mapscale =  $mapdim[img_WIDTH]/ $coords_map_width;  

        switch ($mapdim[img_TYPE]) {
            case 1:
                $mapimg = ImageCreateFromGif($mapimagepath);
                break;

            case 2:
                $mapimg = ImageCreateFromJpeg($mapimagepath);
                break;

            case 3:
                $mapimg = ImageCreateFromPng($mapimagepath);
                break;
        }

       //Query über drei Tabellen
       //treptow (einrichtungen, kategorie,strasse, hausnummer), hausnr 
(strasse, hausnummer, koordinaten) und symbols (kategorie, pfad zur 
bilddatei)
        
        $qry .="SELECT * FROM treptow t, hausnr h, symbols s WHERE 
t.Strasse = h.Strasse && t.Hausnr = h.Hausnr && t.Kategorie = s.Kategorie";
        $res = mysql_query($qry);

        while ($row = mysql_fetch_object($res)) {
            $dimic = GetImageSize($row->Pfad);
            switch ($dimic[img_TYPE]) {
                case 1:
                    $tmpimg = ImageCreateFromGif($row->Pfad);
                    break;

                case 2:
                    $tmpimg = ImageCreateFromJpeg($row->Pfad);
                    break;

                case 3:
                     $tmpimg = ImageCreateFromPng($row->Pfad);
                    break;
            }
            
            $x = ($row->X - $map->extent->minx) * $mapscale;
            $y = $mapdim[img_HEIGHT] - (($row->Y - $map->extent->miny) * 
$mapscale);
            @ImageCopy ($mapimg, $tmpimg, $x, $y, 0, 0, 
$dimic[img_WIDTH], $dimic[img_HEIGHT]);
        } 
        // SAVE THE NEW IMAGE ON THE OLD ONE
        switch ($mapdim[img_TYPE]) {
            case 1:
                ImageGif($mapimg, $mapimagepath);
                break;
            case 2:
                ImageJpeg($mapimg, $mapimagepath);
                break;
            case 3:
                ImagePng($mapimg, $mapimagepath);
                break;
        } 
}

// Retrieve mapfile and create a map from it
$map = ms_newMapObj($map_path.$map_file);

$img = $map->draw();
$url = $img->saveWebImage();
AddImagesToMap($url,$map, $imgpath);

?>
<HTML>
<HEAD>
<TITLE>Treptow-K&ouml;penick</TITLE>
</HEAD>
<BODY>
<img src="<?php echo $url; ?>" border="1">
</BODY>
</HTML>           

-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: http://www.intevation.de/pipermail/mapserver-de/attachments/20061130/8a027d17/attachment.html


This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)