使用 GeometryService 计算 WMTS 图层地图范围 [英] Calculate WMTS layer map extent with GeometryService

查看:29
本文介绍了使用 GeometryService 计算 WMTS 图层地图范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 WMTS 背景层、WMS 层和图形层中的一组点.这些点具有 wgs84latlng 坐标,用于计算地图的范围.

I have WMTS background layer, a WMS Layer and an array of points in a graphic layer. The points have wgs84latlng coordinates that are used to calculate the extent of the map.

不工作:

当使用 GeometryService 计算范围时,wms 图层很好地投影在它的顶部,只是它的位置向上移动并且与 GeometryService 计算的 GraphicsLayer 中的点的位置不对应...

When calculating the extent with a GeometryService the the wms layer is nicely projected on top of it only it's position is shifted upwards and not corresponding with the GeometryService calculated position of the points in the GraphicsLayer...

服务:

    <esri:GeometryService id="geometryService"
                          concurrency="last"
                          fault="geometryService_faultHandler(event)"
                          projectComplete="projectCompleteHandler(event)"
                          showBusyCursor="true"
                          url="http://sampleserver6.arcgisonline.com/arcgis/rest/services/Utilities/Geometry/GeometryServer"/>

    <esri:GeometryService id="geometryService2"
                          concurrency="last"
                          fault="geometryService_faultHandler(event)"
                          projectComplete="projectCompleteHandler2(event)"
                          showBusyCursor="true"
                          url="http://sampleserver6.arcgisonline.com/arcgis/rest/services/Utilities/Geometry/GeometryServer"/>

层:

    <esri:ArcGISTiledMapServiceLayer id="arcgisonlineLayer" load="{trace(arcgisonlineLayer.version)}" 
                                     url="http://services.arcgisonline.nl/arcgis/rest/services/Basiskaarten/PDOK_BRT/MapServer"/>   

    <esri:WMSLayer url="{wmsLayerUrl}">
        <esri:visibleLayers>
            <s:ArrayList>
                <fx:String>0</fx:String><!-- GTG vlakken -->
                <fx:String>1</fx:String><!-- GTG lijnen -->
                <!--<fx:String>2</fx:String>--><!-- Provinciale wegen-->
                <fx:String>3</fx:String><!-- GTG punten -->
                <fx:String>4</fx:String><!-- Kilometrering -->
                <fx:String>5</fx:String><!-- Kilometrering -->
                <fx:String>6</fx:String><!-- Kilometrering -->
                <fx:String>7</fx:String><!-- Kilometrering -->
                <fx:String>8</fx:String><!-- Beheergebied -->
                <!--<fx:String>9</fx:String>--><!-- Eigendomsgebied -->
                <!--<fx:String>10</fx:String>--><!-- Onderhoudsgebied -->
            </s:ArrayList>
        </esri:visibleLayers>
    </esri:WMSLayer>

    <esri:GraphicsLayer id="lichtpuntLayer"  />

计算范围:

public function set mapItemBounds(value:Object):void
        {
            _mapItemBounds = value as LatLngBounds;

            if(_mapItemBounds)
            {
                var wmExtent:WebMercatorExtent = new WebMercatorExtent(
                    _mapItemBounds.getSouthWest().lng(),
                    _mapItemBounds.getSouthWest().lat(),
                    _mapItemBounds.getNorthEast().lng(),
                    _mapItemBounds.getNorthEast().lat());
                var outSR:SpatialReference = new SpatialReference(28992);
                const projectParameters:ProjectParameters = new ProjectParameters;
                projectParameters.geometries = [ wmExtent];
                projectParameters.outSpatialReference = outSR;
                geometryService.project(projectParameters);

            }
        }

计算地图上的位置点

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            super.updateDisplayList(unscaledWidth, unscaledHeight);

            if(mapItemsProject) { 
                mapItemsProject = false;
                var mapItemGeometryArr:Array = new Array();
                for each(var mapItem:IMapItem in mapItems) {
                    var latlng:LatLng = new LatLng(mapItem.wgs84Lat, mapItem.wgs84Lon);
                    mapItemGeometryArr.push(latlng.mapPoint())
                }

                var outSR:SpatialReference = new SpatialReference(28992);
                const projectParameters:ProjectParameters = new ProjectParameters;
                projectParameters.geometries =  mapItemGeometryArr;
                projectParameters.outSpatialReference = outSR;
                geometryService2.project(projectParameters);
            }

工作正常:

...与使用默认 arcgisonline.com worldSteetMap 时的比较.

...in comparison when using the default arcgisonline.com worldSteetMap.

层:

<esri:ArcGISTiledMapServiceLayer id="serviceLayer"
        url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" 
        visible="{viewModeButtonBar.selectedIndex == 0}"/>

    <esri:ArcGISTiledMapServiceLayer 
        url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"
        visible="{viewModeButtonBar.selectedIndex == 1}"/>  

    <!--PDOK layer is incompatable with lichtpuntLayer and id="map". If lichtpuntLayer and another map in declarations it will show up-->
    <!--<esri:ArcGISTiledMapServiceLayer visible="true"
        url="http://services.arcgisonline.nl/arcgis/rest/services/Basiskaarten/PDOK_BRT/MapServer"/>-->


    <esri:WMSLayer url="{wmsLayerUrl}">
        <esri:visibleLayers>
            <s:ArrayList>
                <fx:String>0</fx:String><!-- GTG vlakken -->
                <fx:String>1</fx:String><!-- GTG lijnen -->
                <!--<fx:String>2</fx:String>--><!-- Provinciale wegen -->
                <fx:String>3</fx:String><!-- GTG punten -->
                <fx:String>4</fx:String><!-- Kilometrering -->
                <fx:String>5</fx:String><!-- Kilometrering -->
                <fx:String>6</fx:String><!-- Kilometrering -->
                <fx:String>7</fx:String><!-- Kilometrering -->
                <fx:String>8</fx:String><!-- Beheergebied -->
            </s:ArrayList>
        </esri:visibleLayers>
    </esri:WMSLayer>

    <esri:GraphicsLayer id="lichtpuntLayer"/>

计算范围:

        public function set mapItemBounds(value:Object):void
        {
            _mapItemBounds = value as LatLngBounds;

            if(_mapItemBounds)
            {
                map.extent = new WebMercatorExtent(
                    _mapItemBounds.getSouthWest().lng(),
                    _mapItemBounds.getSouthWest().lat(),
                    _mapItemBounds.getNorthEast().lng(),
                    _mapItemBounds.getNorthEast().lat());
            }
        }

有人知道为什么这不起作用吗?

Anyone knows why this is not working?

推荐答案

因为是一个带有 RD_New 结构的平铺地图,你需要让 GeometryService 做一个 DatumTransform当你发送它们时,也在纬度点上;就我而言,Amersfoort_To_WGS_1984_2008_MB".我还必须将 wkid 设置为 108457 并将 transformForward 设置为 false(默认).

Because the is a tiled map with a RD_New structure you need to let the GeometryService do a DatumTransform on latlng points too when you send them; in my case "Amersfoort_To_WGS_1984_2008_MB". Also I had to set wkid to 108457 and transformForward to false (default).

            var projectParameters:ProjectParameters = new ProjectParameters();
            var datumTransform: DatumTransform = new DatumTransform();
            datumTransform.wkid = 108457;
            datumTransform.wkt = "Amersfoort_To_WGS_1984_2008_MB";
            projectParameters.outSpatialReference = new SpatialReference(28992);
            projectParameters.datumTransform = datumTransform;
            projectParameters.transformForward = false;
            projectParameters.geometries = [ webMercatorExtent ];
            geometryService1.project(projectParameters)

这篇关于使用 GeometryService 计算 WMTS 图层地图范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆