[Mapserver-DE] point-layer mit mysql, php/mapscript und versch. symbolen?
Kai Behncke
kbehncke at igf.uni-osnabrueck.de
Don Nov 30 15:56:54 CET 2006
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
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)