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