Exemple #1
0
 $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;
 }
Exemple #2
0
 //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;
 }
Exemple #3
0
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/>");
            }
        }
    }
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #7
0
/*****************************************************************************
 * 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);
Exemple #8
0
 * 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);
Exemple #9
0
 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;
 }
Exemple #10
0
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;
}