svn commit: r46 - trunk/mapbender/http/classes/class_gml.php
uli at osgeo.org
uli at osgeo.org
Thu Apr 13 16:57:41 EDT 2006
Author: uli
Date: 2006-04-13 20:57:41+0000
New Revision: 46
Added:
trunk/mapbender/http/classes/class_gml.php
Log:
import Mapbender source without history
Added: trunk/mapbender/http/classes/class_gml.php
Url: https://mapbender.osgeo.org/source/browse/mapbender/trunk/mapbender/http/classes/class_gml.php?view=auto&rev=46
==============================================================================
--- (empty file)
+++ trunk/mapbender/http/classes/class_gml.php 2006-04-13 20:57:41+0000
@@ -0,0 +1,356 @@
+<?php
+# $Id: class_gml.php,v 1.16 2006/03/09 12:39:40 uli_rothstein Exp $
+# $Header: /cvsroot/mapbender/mapbender/http/classes/class_gml.php,v 1.16 2006/03/09 12:39:40 uli_rothstein Exp $
+# Copyright (C) 2002 CCGIS
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+require_once("../../conf/mapbender.conf");
+require_once("class_mb_exception.php");
+require_once("class_gmlMember.php");
+require_once("class_geomObj.php");
+require_once("class_geomColl.php");
+
+class gml{
+ /*
+ * Class variables:
+ */
+ var $bbox = array();
+ var $width;
+ var $height;
+ var $gml;
+ var $lineColor = array(255, 0, 0);
+ var $lineThickness = 3;
+ var $textColor = array(0, 0, 0);
+
+ var $cnt_gml;
+ var $geomColl = array();
+
+ var $pointSingle = array("GML:POINT");
+ var $lineSingle = array("GML:LINESTRING");
+ var $polygonSingle = array("GML:POLYGON");
+ var $multi = array("GML:MULTIPOINT", "GML:MULTILINESTRING", "GML:MULTIPOLYGON");
+ var $tagList = array();
+
+
+ function setImageWidth($w) {
+ $this->width = $w;
+ }
+ function setImageHeight($h) {
+ $this->height = $h;
+ }
+ function setLineThickness($t) {
+ $this->lineThickness = $t;
+ }
+ function setLineColor($c) {
+ $this->lineColor = $c;
+ }
+ function setTextColor($c) {
+ $this->textColor = $c;
+ }
+ function setBBox($gmlIndex, $b) {
+ $this->bbox[$gmlIndex] = explode(",", $b);
+ }
+
+ function gml() {
+ $this->cnt_gml = -1;
+ $this->linethickness = 1;
+ }
+
+ function addGmlList($gmlString, $separator) {
+ $gmlArray = explode($separator, $gmlString);
+
+ $this->addGml($gmlArray);
+ }
+
+ function addGml($gmlArray){
+
+ for ($i=0; $i<count($gmlArray); $i++) {
+ $this->cnt_gml++;
+ $this->gml[$this->cnt_gml] = $gmlArray[$i];
+
+ #parseBbox will calculate a bbox that delivers
+ #some output for testing.
+ #uncomment the following line if there is no bbox
+ #and you want to test png output
+ #otherwise, you have to set a bbox with setBbox
+ #$this->parseBbox($i, $gmlArray[$i]);
+
+ $this->geomColl[$this->cnt_gml] = new geomColl();
+ $this->parseGml($i);
+ }
+ }
+
+
+ function getBBox($i) {
+ return $this->bbox[$i];
+ }
+
+ function getGml($i) {
+ return $this->gml[$i];
+ }
+
+
+ function getAllGeomColl(){
+ return $this->geomColl;
+ }
+
+ function getGeomColl($gmlIndex){
+ return $this->geomColl[$gmlIndex];
+ }
+
+
+ function parseGml($index){
+ $data = str_replace("&", "&", $this->gml[$index]);
+
+ $this->tagList = array_merge($this->multi, $this->pointSingle, $this->lineSingle, $this->polygonSingle);
+
+ $parser = xml_parser_create();
+ xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
+ xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
+ xml_parser_set_option($parser,XML_OPTION_TARGET_ENCODING,CHARSET);
+ xml_parse_into_struct($parser,$data,$values,$tags);
+ $code = xml_get_error_code ($parser);
+ if ($code) {
+ $line = xml_get_current_line_number($parser);
+ $mb_exception = new mb_exception(xml_error_string($code) . " in line " . $line);
+ }
+ xml_parser_free($parser);
+
+ $item = -1;
+ $cnt_el = 1;
+ $geom = false;
+ $foundGeom = false;
+ $typeset=false;
+ $member=false;
+
+
+ foreach ($values as $element) {
+ if(strtoupper($element['tag']) == strtoupper("gml:featureMember") && $element['type'] == "open"){
+ $member = true;
+ }
+
+ if (in_array(strtoupper($element['tag']),$this->tagList) && $element['type'] == "open" && $member==true && $geom==false && $typeset==false) {
+ $this->geomColl[$index]->addGeometryMember($element['tag']);
+ $typeset=true;
+ }
+
+ if(in_array(strtoupper($element['tag']),$this->pointSingle) && $element['type'] == "open" && $typeset==true){
+ $foundGeom = true;
+ $geom = true;
+ $this->geomColl[$index]->addPoint();
+ }
+ if(in_array(strtoupper($element['tag']),$this->lineSingle) && $element['type'] == "open" && $typeset==true){
+ $foundGeom = true;
+ $geom = true;
+ $this->geomColl[$index]->addLine();
+ }
+ if(in_array(strtoupper($element['tag']),$this->polygonSingle) && $element['type'] == "open" && $typeset==true){
+ $foundGeom = true;
+ $geom = true;
+ $this->geomColl[$index]->addPolygon();
+ }
+
+ if(strtoupper($element['tag']) == strtoupper("gml:coordinates") && $geom == true){
+ $myGeom = $this->prepareCoordinates($element['value']);
+ $coord = explode(",",$myGeom);
+ for($i=0;$i<count($coord)-1; $i += 2){
+ $coordinates = array($coord[$i], $coord[$i+1]);
+ $this->geomColl[$index]->addCoordinates($coordinates);
+ }
+
+ }
+ if(strtoupper($element['tag']) == strtoupper("label")){
+ $this->geomColl[$index]->addLabel($element['value']);
+ }
+
+ if ($foundGeom == true && $geom == false && substr($element['tag'], 0, 4) != "gml:" && isset($element['value'])) {
+ $this->geomColl[$index]->addAttribute($element['tag'], $element['value']);
+ }
+
+ if((in_array(strtoupper($element['tag']),$this->pointSingle)
+ || in_array(strtoupper($element['tag']),$this->lineSingle)
+ || in_array(strtoupper($element['tag']),$this->polygonSingle))
+ && $element['type'] == "close"){
+
+ $geom = false;
+ }
+ if(strtoupper($element['tag']) == strtoupper("gml:featureMember") && $element['type'] == "close"){
+ $member = false;
+ $foundGeom = false;
+ $typeset=false;
+ }
+ }
+
+ }
+
+
+ // if there is no bbox given by setbbox, this funtion finds lowest and highest x- & y-coordinates
+ // and sets the bbox according to these values
+ // if found it very useful for testing the png output, but now it may be obsolete
+ function parseBbox($gmlIndex, $gml){
+ $data = str_replace("&", "&", $gml);
+
+ $parser = xml_parser_create();
+ xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
+ xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
+ xml_parse_into_struct($parser,$data,$values,$tags);
+ $code = xml_get_error_code ($parser);
+ if ($code) {
+ $line = xml_get_current_line_number($parser);
+ $mb_exception = new mb_exception(xml_error_string($code) . " in line " . $line);
+ }
+ xml_parser_free($parser);
+
+ $boundingbox = false;
+ $cnt_member = false;
+ $min_x = "";
+ $min_y = "";
+ $max_x = "";
+ $max_y = "";
+
+ foreach ($values as $element) {
+ if(strtoupper($element['tag']) == strtoupper("gml:featureMember") && $element['type'] == "open"){
+ $cnt_member=true;
+ }
+ if((in_array(strtoupper($element['tag']),$this->pointSingle)
+ || in_array(strtoupper($element['tag']),$this->lineSingle)
+ || in_array(strtoupper($element['tag']),$this->polygonSingle)) && $element['type'] == "open"){
+ $boundingbox=true;
+ }
+
+ if(strtoupper($element['tag']) == strtoupper("gml:coordinates") && $boundingbox == true){
+ $myGeom = $this->prepareCoordinates($element['value']);
+ $coord = explode(",",$myGeom);
+ for($i=0;$i<count($coord)-1; $i += 2){
+ if ($coord[$i] < $min_x || !$min_x) {
+ $min_x = $coord[$i];
+ }
+ if ($coord[$i] > $max_x || !$max_x) {
+ $max_x = $coord[$i];
+ }
+ if ($coord[$i+1] < $min_y || !$min_y) {
+ $min_y = $coord[$i+1];
+ }
+ if ($coord[$i+1] > $max_y || !$max_y) {
+ $max_y = $coord[$i+1];
+ }
+ }
+ }
+
+ if((in_array(strtoupper($element['tag']),$this->pointSingle)
+ || in_array(strtoupper($element['tag']),$this->lineSingle)
+ || in_array(strtoupper($element['tag']),$this->polygonSingle)) && $element['type'] == "close"){
+ $boundingbox = false;
+ }
+ if(strtoupper($element['tag']) == strtoupper("gml:featureMember") && $element['type'] == "close"){
+ $cnt_member=false;
+ }
+ }
+ $this->bbox[$gmlIndex][0] = $min_x;
+ $this->bbox[$gmlIndex][1] = $min_y;
+ $this->bbox[$gmlIndex][2] = $max_x;
+ $this->bbox[$gmlIndex][3] = $max_y;
+ }
+
+ function prepareCoordinates($strCoords){
+ $ret = preg_replace("/\s/i", ",", trim($strCoords));
+ return $ret;
+ }
+
+ function png ($gmlIndex, $label){
+ $image = imagecreate($this->width,$this->height);
+ $transparent = ImageColorAllocate($image,255,255,255);
+ ImageFilledRectangle($image,0,0,$this->width,$this->height,$transparent);
+ ImageColorTransparent ($image , $transparent);
+
+ $line = imagecolorallocate($image, $this->lineColor[0], $this->lineColor[1], $this->lineColor[2]);
+ if($this->lineColor != $this->textColor){
+ $text = imagecolorallocate($image, $this->textColor[0], $this->textColor[1], $this->textColor[2]);
+ } else{
+ $text = $line;
+ }
+ imagesetthickness($image, $this->lineThickness);
+
+ $image = $this->geomColl[$gmlIndex]->addToPng($image, $this->bbox[$gmlIndex], $this->width, $this->height, $line, $text, $label);
+
+ return $image;
+ }
+
+ function gml2JavaObj($gmlIndex) {
+ $javaObjStr = "";
+ $javaObjStr .= $this->geomColl[$gmlIndex]->getJavaObjStr($this->bbox[$gmlIndex], $this->width, $this->height);
+ return $javaObjStr;
+ }
+
+
+}
+
+
+#so far, this class has only been tested with gmls generated by UMN map server
+
+#load gml files like this
+#$data[0] = implode("", file("fluesse.xml"));
+#$data[1] = implode("", file("staedte.xml"));
+#$data[2] = implode("", file("plz.xml"));
+
+#initiate gml object like this
+#$D = new gml();
+#$D->parseGml();
+#you can add gml objects by passing a string of gmls...
+#$separator = "___";
+#$list = $data[0] . $separator . $data[1] . $separator . $data[2];
+#$D->addGmlList($list, $separator);
+
+# .. or alternatively by passing an array of gmls
+#$D->addGml($data);
+
+#print_r($D->getBBox(0));
+
+# you have to set a bbox for each gml
+# if no bbox is set, png output will not work
+#$D->setBBox(0, "3399409.885263,5566197.180021,3410613.307859,5573006.265254");
+
+#you can set the parameters for graphical output like this
+#$D->setImageWidth(640);
+#$D->setImageHeight(480);
+#$D->setLineThickness(1);
+#$D->setLineColor(array(125, 40, 25));
+
+#retrieve all geometries of all gmls like this
+#$data = $D->getAllGeomColl();
+
+#this is the way to get a single feature member
+#$data = $D->getGeomColl(2)->getMember(3)->getGeomObj(2);
+
+#if you want the data structure of a single gml, try this
+#$data = $D->getGeomColl(1);
+
+#this is how the data structure looks like (view source)
+#print_r($data);
+
+# if your gmls have points, you can add labels
+# from the attributes of the gml for png output
+#$data = $D->getGeomColl(2);
+#$member = $data->getMember(0);
+#$keys = $member->getAllAttributeKeys();
+#header("Content-type: image/png");
+#imagepng($D->png(2, $keys[3]));
+
+#alternatively, you can display the png without labels
+#imagepng($D->png(0, ""));
+#imagepng($D->png(1, ""));
+#check the subclasses for further documentation
+
+?>
\ No newline at end of file
More information about the Mapbender_commits
mailing list