$mappings = $_SESSION['property_mappings'][$layerObj->GetObjectId()]; //TODO : seems that property mapping breaks the selection ???? //could it be that $selection->AddFeatures($layerObj, $featureReader, 0) is //the one causing a problem when the properies are limited ? if (0 && count($mappings) > 0) { foreach ($mappings as $name => $value) { $queryOptions->AddFeatureProperty($name); //echo "$name $value <br>\n"; } $geomName = $layerObj->GetFeatureGeometryName(); $queryOptions->AddFeatureProperty($geomName); } //get the layer filter value if supplied $layerReader = $resourceService->GetResourceContent($layerObj->GetLayerDefinition()); $xmldoc = new DOMDocument(); $xmldoc->loadXML(ByteReaderToString($layerReader)); $xpathObj = new domXPath($xmldoc); $xpathStr = "/LayerDefinition/VectorLayerDefinition/Filter"; //TODO: need this for DWF or Grid layers? $xpathQuery = $xpathObj->query($xpathStr); $layerFilter = ''; if ($xpathQuery->length > 0) { $layerFilter = $xpathQuery->item(0)->nodeValue; } /* create the combined filter value*/ $combinedFilter = ''; if ($filter != '' && $layerFilter != '') { $combinedFilter = "(" . $filter . ") AND (" . $layerFilter . ")"; } else { $combinedFilter = $filter . $layerFilter; }
//only retrieve properties that we actually need $mappings = $_SESSION['property_mappings'][$layerObj->GetObjectId()]; //TODO : seems that property mapping breaks the selection ???? //could it be that $selection->AddFeatures($layerObj, $featureReader, 0) is //the one causing a problem when the properies are limited ? if (0 && count($mappings) > 0) { foreach ($mappings as $name => $value) { $queryOptions->AddFeatureProperty($name); //echo "$name $value <br>\n"; } $geomName = $layerObj->GetFeatureGeometryName(); $queryOptions->AddFeatureProperty($geomName); } //get the layer filter value if supplied $layerReader = $resourceService->GetResourceContent($layerObj->GetLayerDefinition()); $xmldoc = DOMDocument::loadXML(ByteReaderToString($layerReader)); $xpathObj = new domXPath($xmldoc); $xpathStr = "/LayerDefinition/VectorLayerDefinition/Filter"; //TODO: need this for DWF or Grid layers? $xpathQuery = $xpathObj->query($xpathStr); $layerFilter = ''; if ($xpathQuery->length > 0) { $layerFilter = $xpathQuery->item(0)->nodeValue; } /* create the combined filter value*/ $combinedFilter = ''; if ($filter != '' && $layerFilter != '') { $combinedFilter = "(" . $filter . ") AND (" . $layerFilter . ")"; } else { $combinedFilter = $filter . $layerFilter; }
function ProcessLayersForLegend($mappingService, $resourceService, $map, $scale, $group, $image) { global $iconWidth, $iconHeight, $height, $fontIndex, $iconFormat, $offsetX, $offsetY, $font, $fontSizePt, $xPad, $yPad, $xIndent, $themeIcon, $groupIcon, $dwfIcon, $rasterIcon, $textColor; $layers = $map->GetLayers(); for ($i = 0; $i < $layers->GetCount(); $i++) { $layer = $layers->GetItem($i); if (!$layer->IsVisible() || !$layer->GetDisplayInLegend()) { //print_r("[SKIP]: Skipping layer (".$layer->GetLegendLabel().") - not visible or not set to display in legend <br/>"); continue; } if ($offsetY > $height) { //print_r("********** STOP! Past image bounds ****************<br/>"); break; } $parentGroup = $layer->GetGroup(); $bRequiredInLegend = false; $grpId = ""; $parentId = ""; if ($group != NULL) { $grpId = $group->GetObjectId(); } if ($parentGroup != NULL) { $parentId = $parentGroup->GetObjectId(); } if ($group == NULL && $parentGroup == NULL) { $bRequiredInLegend = true; } else { if ($parentGroup != NULL && $group != NULL && $group->GetObjectId() == $parentGroup->GetObjectId()) { $bRequiredInLegend = true; } } if (!$bRequiredInLegend) { //print_r("[SKIP]: Skipping layer (".$layer->GetLegendLabel().", group: $grpId, layer's parent: $parentId) - not required in legend <br/>"); continue; } $ldfId = $layer->GetLayerDefinition(); $layerContent = $resourceService->GetResourceContent($ldfId); $xmldoc = new DOMDocument(); $xmldoc->loadXML(ByteReaderToString($layerContent)); $scaleRanges = $xmldoc->getElementsByTagName('VectorScaleRange'); if ($scaleRanges->length == 0) { $scaleRanges = $xmldoc->getElementsByTagName('GridScaleRange'); if ($scaleRanges->length > 0) { //Draw the image imagecopy($image, $rasterIcon, $offsetX, $offsetY, 0, 0, $iconWidth, $iconHeight); //Draw the label //imagettftext($image, $fontSizePt, 0, ($offsetX + $xPad + $iconWidth), $offsetY, $textColor, $font, $layer->GetLegendLabel()); imagestring($image, $fontIndex, $offsetX + $xPad + $iconWidth, $offsetY, $layer->GetLegendLabel(), $textColor); $offsetY += $yPad; $offsetY += $iconHeight; return; } else { $scaleRanges = $xmldoc->getElementsByTagName('DrawingLayerDefinition'); if ($scaleRanges->length > 0) { //Draw the image imagecopy($image, $dwfIcon, $offsetX, $offsetY, 0, 0, $iconWidth, $iconHeight); //Draw the label //imagettftext($image, $fontSizePt, 0, ($offsetX + $xPad + $iconWidth), $offsetY, $textColor, $font, $layer->GetLegendLabel()); imagestring($image, $fontIndex, $offsetX + $xPad + $iconWidth, $offsetY, $layer->GetLegendLabel(), $textColor); $offsetY += $yPad; $offsetY += $iconHeight; return; } } } //print_r("Processing layer (".$layer->GetLegendLabel()."). Scale range count: ".$scaleRanges->length."<br/>"); for ($sc = 0; $sc < $scaleRanges->length; $sc++) { $scaleRangeObj = NULL; $scaleRangeObj->styles = array(); $scaleRange = $scaleRanges->item($sc); $minElt = $scaleRange->getElementsByTagName('MinScale'); $maxElt = $scaleRange->getElementsByTagName('MaxScale'); $minScale = "0"; $maxScale = 'infinity'; // as MDF's VectorScaleRange::MAX_MAP_SCALE if ($minElt->length > 0) { $minScale = $minElt->item(0)->nodeValue; } if ($maxElt->length > 0) { $maxScale = $maxElt->item(0)->nodeValue; } //Style is within our scale if ($minScale == "0" && $maxScale == "infinity" || $scale >= floatval($minScale) && $scale <= floatval($maxScale) || $maxScale == "infinity" && $scale >= floatval($minScale)) { $styleIndex = 0; if (!IsThemed($scaleRange, $gt)) { //print_r($layer->GetLegendLabel()." - ".$ldfId->ToString()." - Un-themed layer (geomType: $gt)<br/>"); $icon = $mappingService->GenerateLegendImage($ldfId, $scale, $iconWidth, $iconHeight, $iconFormat, $gt, 0); $sink = new MgByteSink($icon); $tempImage = sys_get_temp_dir() . DIRECTORY_SEPARATOR . "mgo_icon" . uniqid(); $sink->ToFile($tempImage); $iconImg = imagecreatefrompng($tempImage); //Draw the image imagecopy($image, $iconImg, $offsetX, $offsetY, 0, 0, $iconWidth, $iconHeight); imagedestroy($iconImg); unlink($tempImage); //Draw the label //imagettftext($image, $fontSizePt, 0, ($offsetX + $xPad + $iconWidth), $offsetY, $textColor, $font, $layer->GetLegendLabel()); imagestring($image, $fontIndex, $offsetX + $xPad + $iconWidth, $offsetY, $layer->GetLegendLabel(), $textColor); $offsetY += $yPad; $offsetY += $iconHeight; } else { if ($scaleRange->getElementsByTagName("CompositeTypeStyle")->length > 0) { $typeStyles = array(4 => "CompositeTypeStyle"); $ruleNames = array(4 => "CompositeRule"); } else { $typeStyles = array(1 => "PointTypeStyle", 2 => "LineTypeStyle", 3 => "AreaTypeStyle"); $ruleNames = array(1 => "PointRule", 2 => "LineRule", 3 => "AreaRule"); } //print_r($layer->GetLegendLabel()." - ".$ldfId->ToString()." - Themed layer ()<br/>"); //Draw the theme icon imagecopy($image, $themeIcon, $offsetX, $offsetY, 0, 0, $iconWidth, $iconHeight); //Draw the themed layer label //imagettftext($image, $fontSizePt, 0, ($offsetX + $xPad + $iconWidth), $offsetY, $textColor, $font, $layer->GetLegendLabel()); imagestring($image, $fontIndex, $offsetX + $xPad + $iconWidth, $offsetY, $layer->GetLegendLabel(), $textColor); $offsetX += $xIndent; $offsetY += $yPad; $offsetY += $iconHeight; //for($ts=0, $count = count($typeStyles); $ts < $count; $ts++) foreach ($typeStyles as $ts => $styleName) { //print_r(" - Checking $styleName ($ts)<br/>"); $typeStyle = $scaleRange->getElementsByTagName($styleName); $catIndex = 0; //print_r(" -- Found ".$typeStyle->length." elements<br/>"); for ($st = 0; $st < $typeStyle->length; $st++) { $styleObj = NULL; // We will check if this typestyle is going to be shown in the legend $showInLegend = $typeStyle->item($st)->getElementsByTagName("ShowInLegend"); if ($showInLegend->length > 0) { if ($showInLegend->item(0)->nodeValue == "false") { //print_r("Skipping $styleName in (".$layer->GetLegendLabel().") because ShowInLegend is: ".$showInLegend->item(0)->nodeValue."<br/>"); continue; // This typestyle does not need to be shown in the legend } } $rules = $typeStyle->item($st)->getElementsByTagName($ruleNames[$ts]); for ($r = 0; $r < $rules->length; $r++) { $rule = $rules->item($r); $label = $rule->getElementsByTagName("LegendLabel"); $labelText = $label->length == 1 ? $label->item(0)->nodeValue : ""; $icon = $mappingService->GenerateLegendImage($ldfId, $scale, $iconWidth, $iconHeight, $iconFormat, $ts, $catIndex++); $sink = new MgByteSink($icon); $tempImage = sys_get_temp_dir() . DIRECTORY_SEPARATOR . "mgo_icon" . uniqid(); $sink->ToFile($tempImage); $iconImg = imagecreatefrompng($tempImage); //Draw the image imagecopy($image, $iconImg, $offsetX, $offsetY, 0, 0, $iconWidth, $iconHeight); imagedestroy($iconImg); unlink($tempImage); //Draw the label //imagettftext($image, $fontSizePt, 0, ($offsetX + $xPad + $iconWidth), $offsetY, $textColor, $font, $layer->GetLegendLabel()); imagestring($image, $fontIndex, $offsetX + $xPad + $iconWidth, $offsetY, $labelText, $textColor); $offsetY += $yPad; $offsetY += $iconHeight; if ($offsetY > $height) { break; } } } } $offsetX -= $xIndent; } } else { //print_r("[SKIP]: Layer (".$layer->GetLegendLabel()."). Current scale ($scale) does not fit scale range [$minScale to $maxScale]<br/>"); } } } }
function buildScaleRanges($layer) { global $resourceService; $resID = $layer->GetLayerDefinition(); $layerContent = $resourceService->GetResourceContent($resID); $xmldoc = DOMDocument::loadXML(ByteReaderToString($layerContent)); $type = 0; $scaleRanges = $xmldoc->getElementsByTagName('VectorScaleRange'); if ($scaleRanges->length == 0) { $scaleRanges = $xmldoc->getElementsByTagName('GridScaleRange'); if ($scaleRanges->length == 0) { $scaleRanges = $xmldoc->getElementsByTagName('DrawingLayerDefinition'); if ($scaleRanges->length == 0) { return; } $type = 2; } else { $type = 1; } } $typeStyles = array("PointTypeStyle", "LineTypeStyle", "AreaTypeStyle", "CompositeTypeStyle"); $ruleNames = array("PointRule", "LineRule", "AreaRule", "CompositeRule"); $output = 'scaleRanges: ['; $scaleSep = ''; for ($sc = 0; $sc < $scaleRanges->length; $sc++) { $scaleRange = $scaleRanges->item($sc); $minElt = $scaleRange->getElementsByTagName('MinScale'); $maxElt = $scaleRange->getElementsByTagName('MaxScale'); $minScale = "0"; $maxScale = "'infinity'"; // as MDF's VectorScaleRange::MAX_MAP_SCALE if ($minElt->length > 0) { $minScale = $minElt->item(0)->nodeValue; } if ($maxElt->length > 0) { $maxScale = $maxElt->item(0)->nodeValue; } $output .= $scaleSep . "{"; $output .= "minScale:" . $minScale . ","; $output .= "maxScale:" . $maxScale; if ($type != 0) { $output .= "}"; $scaleSep = ','; break; } $output .= ',styles:['; $styleIndex = 0; $styleSep = ''; for ($ts = 0, $count = count($typeStyles); $ts < $count; $ts++) { $typeStyle = $scaleRange->getElementsByTagName($typeStyles[$ts]); $catIndex = 0; for ($st = 0; $st < $typeStyle->length; $st++) { // We will check if this typestyle is going to be shown in the legend $showInLegend = $typeStyle->item($st)->getElementsByTagName("ShowInLegend"); if ($showInLegend->length > 0) { if ($showInLegend->item(0)->nodeValue == "false") { continue; } } // This typestyle does not need to be shown in the legend $rules = $typeStyle->item(0)->getElementsByTagName($ruleNames[$ts]); for ($r = 0; $r < $rules->length; $r++) { $rule = $rules->item($r); $label = $rule->getElementsByTagName("LegendLabel"); $filter = $rule->getElementsByTagName("Filter"); $labelText = $label->length == 1 ? $label->item(0)->nodeValue : ""; $filterText = $filter->length == 1 ? $filter->item(0)->nodeValue : ""; $output .= $styleSep . "{"; $output .= "legendLabel:'" . addslashes(trim($labelText)) . "',"; $output .= "filter:'" . addslashes(trim($filterText)) . "',"; $output .= "geometryType:" . ($ts + 1) . ","; $output .= "categoryIndex:" . $catIndex++; $output .= '}'; $styleSep = ','; } } } $output .= ']}'; $scaleSep = ','; } $output .= ']'; return $output; }
function IsLayerEditable($resourceService, $layer, $xmldoc = NULL) { $result = true; $dataSourceId = new MgResourceIdentifier($layer->GetFeatureSourceId()); if ($xmldoc == NULL) { $byteReader = $resourceService->GetResourceContent($dataSourceId); $xmldoc = DOMDocument::loadXML(ByteReaderToString($byteReader)); } $parameterList = $xmldoc->getElementsByTagName('Parameter'); for ($i = 0; $i < $parameterList->length; $i++) { $parameter = $parameterList->item($i); $nameElt = $parameter->getElementsByTagName('Name'); $name = $nameElt->item(0)->nodeValue; if ($name != 'ReadOnly') { continue; } else { $valueElt = $parameter->getElementsByTagName('Value'); $value = $valueElt->item(0)->nodeValue; $result = strcasecmp($value, 'TRUE') == 0 ? false : true; break; } } return $result; }
function buildScaleRanges($layer) { global $resourceService; $resID = $layer->GetLayerDefinition(); $layerContent = $resourceService->GetResourceContent($resID); $xmldoc = new DOMDocument(); $xmldoc->loadXML(ByteReaderToString($layerContent)); $type = 0; $scaleRanges = $xmldoc->getElementsByTagName('VectorScaleRange'); if ($scaleRanges->length == 0) { $scaleRanges = $xmldoc->getElementsByTagName('GridScaleRange'); if ($scaleRanges->length == 0) { $scaleRanges = $xmldoc->getElementsByTagName('DrawingLayerDefinition'); if ($scaleRanges->length == 0) { return; } $type = 2; } else { $type = 1; } } $typeStyles = array("PointTypeStyle", "LineTypeStyle", "AreaTypeStyle"); $ruleNames = array("PointRule", "LineRule", "AreaRule"); $output = ''; for ($sc = 0; $sc < $scaleRanges->length; $sc++) { $scaleRange = $scaleRanges->item($sc); $minElt = $scaleRange->getElementsByTagName('MinScale'); $maxElt = $scaleRange->getElementsByTagName('MaxScale'); $minScale = "0"; $maxScale = "1000000000000.0"; // as MDF's VectorScaleRange::MAX_MAP_SCALE if ($minElt->length > 0) { $minScale = $minElt->item(0)->nodeValue; } if ($maxElt->length > 0) { $maxScale = $maxElt->item(0)->nodeValue; } if ($type != 0) { break; } $output .= '<scalerange>'; $output .= '<minscale>' . $minScale . '</minscale>'; $output .= '<maxscale>' . $maxScale . '</maxscale>'; $styleIndex = 0; for ($ts = 0, $count = count($typeStyles); $ts < $count; $ts++) { $typeStyle = $scaleRange->getElementsByTagName($typeStyles[$ts]); $catIndex = 0; for ($st = 0; $st < $typeStyle->length; $st++) { $rules = $typeStyle->item(0)->getElementsByTagName($ruleNames[$ts]); for ($r = 0; $r < $rules->length; $r++) { $rule = $rules->item($r); $label = $rule->getElementsByTagName("LegendLabel"); $filter = $rule->getElementsByTagName("Filter"); $labelText = $label->length == 1 ? $label->item(0)->nodeValue : ""; $filterText = $filter->length == 1 ? $filter->item(0)->nodeValue : ""; $output .= '<styleitem>'; $output .= '<label>' . htmlspecialchars(trim($labelText)) . '</label>'; $output .= '<filter>' . htmlspecialchars(trim($filterText)) . '</filter>'; $output .= '<geomtype>' . ($ts + 1) . '</geomtype>'; $output .= '<categoryindex>' . $catIndex++ . '</categoryindex>'; $output .= '</styleitem>'; } } } $output .= '</scalerange>'; } echo $output; }
/***************************************************************************** * Purpose: a list of map definitions within a given repository folder *****************************************************************************/ include "Common.php"; if (InitializationErrorOccurred()) { DisplayInitializationErrorText(); exit; } include '../../../common/php/Utilities.php'; //Get the folder to search within $root = isset($_REQUEST['folder']) ? $_REQUEST['folder'] : 'Library://'; $rootId = new MgResourceIdentifier($root); //Enumerate elements of type MapDefinition $maps = $resourceService->EnumerateResources($rootId, -1, 'MapDefinition'); //make a list of maps to query for names $mapListXml = DOMDocument::loadXML(ByteReaderToString($maps)); //$aMapAssoc = Array(); $aMapIds = $mapListXml->getElementsByTagName('ResourceId'); //iterate over mapIds to retrieve names //output map list as JSON $result = NULL; $result->maps = array(); for ($i = 0; $i < $aMapIds->length; $i++) { $mapId = new MgResourceIdentifier($aMapIds->item($i)->nodeValue); $md = NULL; $md->path = $aMapIds->item($i)->nodeValue; $md->name = $mapId->GetName(); array_push($result->maps, $md); } header('Content-type: application/json'); echo var2json($result);
* Purpose: a list of map definitions within a given repository folder *****************************************************************************/ include "Common.php"; if (InitializationErrorOccurred()) { DisplayInitializationErrorText(); exit; } include '../../../common/php/Utilities.php'; //Get the folder to search within $root = isset($_REQUEST['folder']) ? $_REQUEST['folder'] : 'Library://'; $rootId = new MgResourceIdentifier($root); //Enumerate elements of type MapDefinition $maps = $resourceService->EnumerateResources($rootId, -1, 'MapDefinition'); //make a list of maps to query for names $mapListXml = new DOMDocument(); $mapListXml->loadXML(ByteReaderToString($maps)); //$aMapAssoc = Array(); $aMapIds = $mapListXml->getElementsByTagName('ResourceId'); //iterate over mapIds to retrieve names //output map list as JSON $result = NULL; $result->maps = array(); for ($i = 0; $i < $aMapIds->length; $i++) { $mapId = new MgResourceIdentifier($aMapIds->item($i)->nodeValue); $md = NULL; $md->path = $aMapIds->item($i)->nodeValue; $md->name = $mapId->GetName(); array_push($result->maps, $md); } header('Content-type: application/json'); echo var2json($result);
function GetGroups($username = NULL) { $aGroups = array(); try { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $site = $siteConnection->GetSite(); if ($username) { $byteReader = $site->EnumerateGroups($username, ''); } else { $byteReader = $site->EnumerateGroups(); } $xmldoc = DOMDocument::loadXML(ByteReaderToString($byteReader)); $groupNodeList = $xmldoc->getElementsByTagName('Group'); for ($i = 0; $i < $groupNodeList->length; $i++) { $group = $groupNodeList->item($i); $nameElt = $group->getElementsByTagName('Name'); $name = $nameElt->item(0)->nodeValue; $descElt = $group->getElementsByTagName('Description'); $description = $descElt->item(0)->nodeValue; array_push($aGroups, array('name' => $name, 'description' => $description)); } } catch (MgException $e) { echo "ERROR: " . $e->GetMessage() . "\n"; echo $e->GetDetails() . "\n"; echo $e->GetStackTrace() . "\n"; } return $aGroups; }
function buildScaleRanges($layer, $xmldoc = NULL) { $aScaleRanges = array(); global $resourceService; if ($xmldoc == NULL) { $resID = $layer->GetLayerDefinition(); $layerContent = $resourceService->GetResourceContent($resID); $xmldoc = DOMDocument::loadXML(ByteReaderToString($layerContent)); } $type = 0; $scaleRanges = $xmldoc->getElementsByTagName('VectorScaleRange'); if ($scaleRanges->length == 0) { $scaleRanges = $xmldoc->getElementsByTagName('GridScaleRange'); if ($scaleRanges->length == 0) { $scaleRanges = $xmldoc->getElementsByTagName('DrawingLayerDefinition'); if ($scaleRanges->length == 0) { return; } $type = 2; } else { $type = 1; } } $typeStyles = array("PointTypeStyle", "LineTypeStyle", "AreaTypeStyle", "CompositeTypeStyle"); $ruleNames = array("PointRule", "LineRule", "AreaRule", "CompositeRule"); for ($sc = 0; $sc < $scaleRanges->length; $sc++) { $scaleRangeObj = NULL; $scaleRangeObj->styles = array(); $scaleRange = $scaleRanges->item($sc); $minElt = $scaleRange->getElementsByTagName('MinScale'); $maxElt = $scaleRange->getElementsByTagName('MaxScale'); $minScale = "0"; $maxScale = 'infinity'; // as MDF's VectorScaleRange::MAX_MAP_SCALE if ($minElt->length > 0) { $minScale = $minElt->item(0)->nodeValue; } if ($maxElt->length > 0) { $maxScale = $maxElt->item(0)->nodeValue; } $scaleRangeObj->minScale = $minScale; $scaleRangeObj->maxScale = $maxScale; if ($type != 0) { array_push($aScaleRanges, $scaleRangeObj); break; } $styleIndex = 0; for ($ts = 0, $count = count($typeStyles); $ts < $count; $ts++) { $typeStyle = $scaleRange->getElementsByTagName($typeStyles[$ts]); $catIndex = 0; for ($st = 0; $st < $typeStyle->length; $st++) { $styleObj = NULL; // We will check if this typestyle is going to be shown in the legend $showInLegend = $typeStyle->item($st)->getElementsByTagName("ShowInLegend"); if ($showInLegend->length > 0) { if ($showInLegend->item(0)->nodeValue == "false") { continue; } } // This typestyle does not need to be shown in the legend $rules = $typeStyle->item($st)->getElementsByTagName($ruleNames[$ts]); for ($r = 0; $r < $rules->length; $r++) { $rule = $rules->item($r); $label = $rule->getElementsByTagName("LegendLabel"); $filter = $rule->getElementsByTagName("Filter"); $labelText = $label->length == 1 ? $label->item(0)->nodeValue : ""; $filterText = $filter->length == 1 ? $filter->item(0)->nodeValue : ""; $styleObj = NULL; $styleObj->legendLabel = trim($labelText); $styleObj->filter = trim($filterText); $styleObj->geometryType = $ts + 1; $styleObj->categoryIndex = $catIndex++; array_push($scaleRangeObj->styles, $styleObj); } } } array_push($aScaleRanges, $scaleRangeObj); } return $aScaleRanges; }