操作地图和图层

1. 遍历地图中的所有图层
    方法MgMap::GetLayers()会返回一个MgLayerCollection对象,这个对象包含了地图中的所图层。MgLayerCollection::GetItem()方法通过图层名称或在MgLayerCollection中的索引编号返回一个单独的MgLayer对象。图层的名称是指定义在地图中的名称,而不是存储在资源库中的图层定义的名称。例如:
    $layer = layers.GetItem(“Roads”);
下面的例子用于列出地图中的所有图层,以及每个图层的可见性设置
    $layers = $map->GetLayers(); // Get layer collection
    echo "<p>Layers:<br />";
    $count = $layers->GetCount();
    for ($i = 0; $i < $count; $i++)
    {
        $layer = $layers->GetItem($i);
        echo $layer->GetName() . ' (' .($layer->GetVisible() ? 'on' : 'off') . ')<br />';
    }
    echo '</p>';

2. 改变图层的属性
    使用方法MgLayer::GetProperty()和MgLayer::SetProperty()可以修改图层的一些属性,例如图层名称、图例标签、图层所在的组等属性。在此,Property代表一个图层某个名称。为了使这些属性生效,你必须保存、重新刷新地图。
下面的例子用于将图层Roads的图例标签在Roads和Streets间切换。
    MgInitializeWebTier ($webconfigFilePath);
    $userInfo = new MgUserInformation($mgSessionId);
    $siteConnection = new MgSiteConnection();
    $siteConnection->Open($userInfo);
    $resourceService = $siteConnection->CreateService(MgServiceType::ResourceService);
    $map = new MgMap();
    $map->Open($resourceService, $mgMapName);
    $layers = $map->GetLayers();
    $roadLayer = $layers->GetItem('Roads');
    $roadLabel = $roadLayer->GetLegendLabel();
    if ($roadLabel == 'Roads')
        $newLabel = 'Streets';
    else
        $newLabel = 'Roads';
    $roadLayer->SetLegendLabel($newLabel);
    // 你必须保存更新后的地图,否则这些改变不会被应用
    $map->Save($resourceService);

3.  改变图层的可见性
    调用方法MgLayer::IsVisible()可以查询图层的实际可见性(Actual Layer Visibility)。但是,没有任何方法可以设置得到图层的实际可见性,因为这取决于我们在前面提到的三个因素。
    调用方法MgLayer::GetVisible()可以获得图层的可见性设置,调用方法MgLayer::SetVisible()可以设置图层的可见性设置。
    调用方法MgGroup::GetVisible()可以获得图层组的可见性设置,调用方法MgGroup::SetVisible()可以设置图层组的可见性设置。
    修改图层定义并修改结果重新保存回资源库,可以改变图层在一个给定的视图比例尺下的可见性。在上一节,我们已经介绍了如何修改修改图层定义。
    下面的例子用来修改图层Roads的可见性设置为可见。
    $layers = $map->GetLayers();
    $roadsLayer = $layers->GetItem('Roads');
    $roadsLayer->SetVisible(True);

4. 给地图添加一个图层
    如果要给地图添加一个图层,首先我们必须创建一个图层对象实例(MgLayer Instance)。那么,如何创建图层对象实例呢?让我们来看看图层类MgLayer的构造函数,它的第一个参数是图层定义的资源Id,第二个参数是资源服务的一个实例。
    MgLayer(MgResourceIdentifier layerDefinition, MgResourceService resourceService);
    所以,在创建一个图层之前,我们必须有一个存储在资源库中的图层定义。
    如果图层定义是像我们在上一节中介绍的那样动态地在内存中创建的,那么我们就需要首先将图层定义存储在资源库中。例如,下面的例子将图层定义存储到会话资源库(session repository),然后给地图添加一个图层,并且返回新建的图层。

    <?php
    require_once('../common/common.php');
    ///
    function add_layer_definition_to_map($layerDefinition,
    $layerName, $layerLegendLabel, $mgSessionId, $resourceService, &$map)
    // 将图层定义存储到会话资源库,然后添加图层到地图中,并且返回新建的图层
    {
        // 校验图层定义
        $domDocument = new DOMDocument;
        $domDocument->loadXML($layerDefinition);
        if (! $domDocument->schemaValidate("$schemaDirectory/LayerDefinition-1.3.0.xsd") )
        {
            echo "ERROR: The new XML document is invalid.<BR>/n.";
            return NULL;
        }
        // 将新的图层定义保存到会话资源库(session repository)
        $byteSource = new MgByteSource($layerDefinition, strlen($layerDefinition));
        $byteSource->SetMimeType(MgMimeType::Xml);
        $resourceID = new MgResourceIdentifier(
        "Session:$mgSessionId//$layerName.LayerDefinition");
        $resourceService->SetResource($resourceID, $byteSource->GetReader(), null);
        $newLayer = add_layer_resource_to_map($resourceID,
        $resourceService, $layerName, $layerLegendLabel, $map);
        return $newLayer;
    }

    function add_layer_resource_to_map($layerResourceID,
    $resourceService, $layerName, $layerLegendLabel, &$map)
    // 将图层添加到地图中,并且返回新建的图层
    {
        $newLayer = new MgLayer($layerResourceID, $resourceService);
        $newLayer->SetName($layerName);
        $newLayer->SetVisible(true);
        $newLayer->SetLegendLabel($layerLegendLabel);
        $newLayer->SetDisplayInLegend(true);
        $layerCollection = $map->GetLayers();
        if (! $layerCollection->Contains($layerName) )
        {
            $layerCollection->Insert(0, $newLayer);
        }
        return $newLayer;
    }

    上面的例子中,将图层定义存储在了会话资源库中。这样,它只会影响用户运行时的地图。其他用户是无法看到这个图层的,而且当用户注销退出的时候这个图层也就消失了。如果想让这个图层永久地存储在MapGuide服务器,能够被其他用户看到和使用,那么你需要使用Library将图层定义写入全局资源库,而不是使用会话Id存储在会话资源库。通过下面的代码,你可以将图层永久地存储在MapGuide服务器。
    $byteSource = new MgByteSource($layerDefinition, strlen($layerDefinition));
    $byteSource->SetMimeType(MgMimeType::Xml);
    $resourceId = new MgResourceIdentifier("Library://LayerName.LayerDefinition");
    $resourceService->SetResource($resourceId, $byteSource->GetReader(), null);

5. 将图层加入一个图层组
    下面的函数可以将图层加入一个图层组。
    function add_layer_to_group($layer, $layerGroupName, $layerGroupLegendLabel, &$map)
    // 将图层加入一个图层组。如果图层组不存在,创建这个图层组。
    {
        // 获得图层组
        $layerGroupCollection = $map->GetLayerGroups();
        if ($layerGroupCollection->Contains($layerGroupName))
        {
            $layerGroup = $layerGroupCollection->GetItem($layerGroupName);
        }
        else
        {
            // 如果图层组不存在,创建这个图层组。
            $layerGroup = new MgLayerGroup($layerGroupName);
            $layerGroup->SetVisible(true);
            $layerGroup->SetDisplayInLegend(true);
            $layerGroup->SetLegendLabel($layerGroupLegendLabel);
            $layerGroupCollection->Add($layerGroup);
        }
        // 将图层加入图层组
        $layer->SetGroup($layerGroup);
    }

6. 调整图层的绘图顺序
    通过MgLayerCollection::Add()新加入的图层位于绘图顺序(Drawing Order)最底端,所以它们可能会被上面的图层所遮挡。如果想指定图层在绘图顺序中的位置,你需要使用方法MgLayerCollection::Insert()。例如,下面的代码会将图层加入地图绘图顺序的最顶端。
    $layerCollection = $map->GetLayers();
    $layerCollection-> Insert(0,$layer);

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值