<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Kai Behncke wrote:<br>
<blockquote cite="mid20061130144711.M45931@igf.uni-osnabrueck.de"
type="cite">
<pre wrap="">On Fri, 17 Nov 2006 01:24:29 +0100, Katja Friebel wrote
</pre>
<blockquote type="cite">
<pre wrap="">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
</pre>
</blockquote>
<pre wrap=""><!---->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: <a class="moz-txt-link-freetext" href="mailto:kbehncke@igf.uni-osnabrueck.de">mailto:kbehncke@igf.uni-osnabrueck.de</a>
Web: <a class="moz-txt-link-freetext" href="http://www.igf.uni-osnabrueck.de">http://www.igf.uni-osnabrueck.de</a>
_______________________________________________
Mapserver-DE mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Mapserver-DE@freegis.org">Mapserver-DE@freegis.org</a>
<a class="moz-txt-link-freetext" href="https://freegis.org/mailman/listinfo/mapserver-de">https://freegis.org/mailman/listinfo/mapserver-de</a>
</pre>
</blockquote>
Hallo Kai,<br>
vielen Dank für deine Hilfe!<br>
Habe mittlerweile alternativ das Tutorial von Roberto Colonello (<a
href="http://www.parsec.it/tutorials/mapserver_add_icons.htm">http://www.parsec.it/tutorials/mapserver_add_icons.htm</a>)
bei mir zum Laufen gebracht :-)<br>
Dabei enthält das mapfile keinen "POI"-Layer (einrichtungen). Mein
php-Skript habe ich beigefügt.<br>
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.<br>
<br>
Viele Grüße, Katja<br>
<br>
<?php<br>
dl('php_mapscript_48.dll'); <br>
<br>
//Beispiel zu finden unter:<br>
//<a class="moz-txt-link-freetext" href="http://www.parsec.it/tutorials/mapserver_add_icons.htm">http://www.parsec.it/tutorials/mapserver_add_icons.htm</a><br>
<br>
define("img_WIDTH", 0);<br>
define("img_HEIGHT", 1);<br>
define("img_TYPE", 2);<br>
<br>
// Path defaults <br>
$map_path="d:/ms4w/apache/htdocs/mobidat_php/test/"; <br>
$map_file="berlin.map"; <br>
$imgpath="d:/ms4w/tmp/";<br>
<br>
function AddImagesToMap($mapurl,$map, $imgpath)<br>
{ <br>
// CONNECT TO DATABASE<br>
include("../db_connect1.inc");<br>
mysql_connect($host, $user, $pwd) or die('Verbindungsaufbau
fehlgeschlagen!');<br>
mysql_select_db(mobidat) or die ("Datenbank konnte nicht
ausgew&auml;hlt werden");<br>
<br>
// PATH WHERE TO FIND THE MAP IMAGE GENERATED BY MAPSERVER<br>
$mapimagepath = $imgpath.$mapurl;<br>
$mapdim = GetImageSize($mapimagepath);<br>
$coords_map_width = $map->extent->maxx -
$map->extent->minx;<br>
$mapscale = $mapdim[img_WIDTH]/ $coords_map_width; <br>
<br>
switch ($mapdim[img_TYPE]) {<br>
case 1:<br>
$mapimg = ImageCreateFromGif($mapimagepath);<br>
break;<br>
<br>
case 2:<br>
$mapimg = ImageCreateFromJpeg($mapimagepath);<br>
break;<br>
<br>
case 3:<br>
$mapimg = ImageCreateFromPng($mapimagepath);<br>
break;<br>
} <br>
<br>
//Query über drei Tabellen<br>
//treptow (einrichtungen, kategorie,strasse, hausnummer), hausnr
(strasse, hausnummer, koordinaten) und symbols (kategorie, pfad zur
bilddatei)<br>
<br>
$qry .="SELECT * FROM treptow t, hausnr h, symbols s WHERE
t.Strasse = h.Strasse && t.Hausnr = h.Hausnr &&
t.Kategorie = s.Kategorie";<br>
$res = mysql_query($qry); <br>
<br>
while ($row = mysql_fetch_object($res)) {<br>
$dimic = GetImageSize($row->Pfad);<br>
switch ($dimic[img_TYPE]) {<br>
case 1:<br>
$tmpimg = ImageCreateFromGif($row->Pfad);<br>
break;<br>
<br>
case 2:<br>
$tmpimg = ImageCreateFromJpeg($row->Pfad);<br>
break;<br>
<br>
case 3:<br>
$tmpimg = ImageCreateFromPng($row->Pfad);<br>
break;<br>
} <br>
<br>
$x = ($row->X - $map->extent->minx) * $mapscale;<br>
$y = $mapdim[img_HEIGHT] - (($row->Y -
$map->extent->miny) * $mapscale);<br>
@ImageCopy ($mapimg, $tmpimg, $x, $y, 0, 0,
$dimic[img_WIDTH], $dimic[img_HEIGHT]);<br>
} <br>
// SAVE THE NEW IMAGE ON THE OLD ONE<br>
switch ($mapdim[img_TYPE]) {<br>
case 1:<br>
ImageGif($mapimg, $mapimagepath);<br>
break;<br>
case 2:<br>
ImageJpeg($mapimg, $mapimagepath);<br>
break;<br>
case 3:<br>
ImagePng($mapimg, $mapimagepath);<br>
break;<br>
} <br>
} <br>
<br>
// Retrieve mapfile and create a map from it<br>
$map = ms_newMapObj($map_path.$map_file);<br>
<br>
$img = $map->draw();<br>
$url = $img->saveWebImage();<br>
AddImagesToMap($url,$map, $imgpath);<br>
<br>
?><br>
<HTML><br>
<HEAD><br>
<TITLE>Treptow-K&ouml;penick</TITLE><br>
</HEAD><br>
<BODY><br>
<img src="<?php echo $url; ?>" border="1"><br>
</BODY><br>
</HTML> <font face="Times New Roman, Times, serif"
size="-1"><strong></strong></font>
<p><font size="-1"><strong></strong></font></p>
</body>
</html>