コード例 #1
0
 public static function CreateLayerItem($reqFeatures, $iconsPerScaleRange, $iconFormat, $iconWidth, $iconHeight, $layer, $parent, $xmldoc, $mappingService)
 {
     $xml = "<Layer>\n";
     $xml .= "<Name>" . $layer->GetName() . "</Name>\n";
     $xml .= "<Type>" . $layer->GetLayerType() . "</Type>\n";
     $xml .= "<LegendLabel>" . MgUtils::EscapeXmlChars($layer->GetLegendLabel()) . "</LegendLabel>\n";
     $xml .= "<ObjectId>" . $layer->GetObjectId() . "</ObjectId>\n";
     if ($parent != null) {
         $xml .= "<ParentId>" . $parent->GetObjectId() . "</ParentId>\n";
     }
     $xml .= "<Selectable>" . ($layer->GetSelectable() ? "true" : "false") . "</Selectable>";
     $xml .= "<DisplayInLegend>" . ($layer->GetDisplayInLegend() ? "true" : "false") . "</DisplayInLegend>\n";
     $xml .= "<ExpandInLegend>" . ($layer->GetExpandInLegend() ? "true" : "false") . "</ExpandInLegend>\n";
     $xml .= "<Visible>" . ($layer->GetVisible() ? "true" : "false") . "</Visible>\n";
     $xml .= "<ActuallyVisible>" . ($layer->IsVisible() ? "true" : "false") . "</ActuallyVisible>\n";
     $ldfId = $layer->GetLayerDefinition();
     $xml .= "<LayerDefinition>" . $ldfId->ToString() . "</LayerDefinition>\n";
     // ----------------------- Optional things if requested ------------------------- //
     if (($reqFeatures & self::REQUEST_LAYER_FEATURE_SOURCE) == self::REQUEST_LAYER_FEATURE_SOURCE) {
         $xml .= "<FeatureSource>\n";
         $xml .= "<ResourceId>" . $layer->GetFeatureSourceId() . "</ResourceId>\n";
         $xml .= "<ClassName>" . $layer->GetFeatureClassName() . "</ClassName>\n";
         $xml .= "<Geometry>" . $layer->GetFeatureGeometryName() . "</Geometry>\n";
         $xml .= "</FeatureSource>\n";
     }
     //Following code ripped from Fusion's LoadMap.php and LoadScaleRanges.php
     if ($xmldoc != null) {
         $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 == 1) {
                     $type = 2;
                 }
             } else {
                 $type = 1;
             }
         }
         $typeStyles = array("PointTypeStyle", "LineTypeStyle", "AreaTypeStyle", "CompositeTypeStyle");
         $ruleNames = array("PointRule", "LineRule", "AreaRule", "CompositeRule");
         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;
             }
             if ($type != 0) {
                 break;
             }
             $scaleVal = 42;
             if (strcmp($maxScale, "infinity") == 0) {
                 $scaleVal = intval($minScale);
             } else {
                 $scaleVal = (intval($minScale) + intval($maxScale)) / 2.0;
             }
             $minScale = intval($minScale);
             if (strcmp($maxScale, "infinity") == 0) {
                 $maxScale = 1000000000000;
             } else {
                 $maxScale = intval($maxScale);
             }
             $xml .= "<ScaleRange>\n<MinScale>{$minScale}</MinScale>\n<MaxScale>{$maxScale}</MaxScale>\n";
             // 2 passes: First to compile icon count (to determine compression), second to write the actual XML
             $iconCount = 0;
             for ($ts = 0, $count = count($typeStyles); $ts < $count; $ts++) {
                 $typeStyle = $scaleRange->getElementsByTagName($typeStyles[$ts]);
                 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($st)->getElementsByTagName($ruleNames[$ts]);
                     $iconCount += $rules->length;
                 }
             }
             $bCompress = $iconCount > $iconsPerScaleRange;
             for ($ts = 0, $count = count($typeStyles); $ts < $count; $ts++) {
                 $typeStyle = $scaleRange->getElementsByTagName($typeStyles[$ts]);
                 $catIndex = 0;
                 if ($typeStyle->length == 0) {
                     continue;
                 }
                 $xml .= "<FeatureStyle>\n";
                 $xml .= "<Type>" . ($ts + 1) . "</Type>\n";
                 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($st)->getElementsByTagName($ruleNames[$ts]);
                     for ($r = 0; $r < $rules->length; $r++) {
                         $bRequestIcon = false;
                         if (!$bCompress) {
                             $bRequestIcon = true;
                         } else {
                             //This is a compressed theme
                             $bRequestIcon = $r == 0 || $r == $rules->length - 1;
                             //Only first and last rule
                         }
                         $rule = $rules->item($r);
                         $label = $rule->getElementsByTagName("LegendLabel");
                         $filter = $rule->getElementsByTagName("Filter");
                         $labelText = MgUtils::EscapeXmlChars($label->length == 1 ? $label->item(0)->nodeValue : "");
                         $filterText = MgUtils::EscapeXmlChars($filter->length == 1 ? $filter->item(0)->nodeValue : "");
                         $geomType = $ts + 1;
                         $themeCategory = $catIndex++;
                         $xml .= "<Rule>\n<LegendLabel>{$labelText}</LegendLabel>\n<Filter>{$filterText}</Filter>\n";
                         if ($bRequestIcon) {
                             $xml .= "<Icon>\n";
                             $xml .= MgUtils::GetLegendImageInline($mappingService, $ldfId, $scaleVal, $geomType, $themeCategory, $iconWidth, $iconHeight, $iconFormat);
                             $xml .= "</Icon>\n";
                         }
                         $xml .= "</Rule>";
                     }
                 }
                 $xml .= "</FeatureStyle>";
             }
             $xml .= "</ScaleRange>";
         }
     } else {
         $xml .= "<ScaleRange />";
     }
     $xml .= "</Layer>";
     return $xml;
 }