Search code examples
apache-flexadobearcgisesriwms

Calculate WMTS layer map extent with GeometryService


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.

NOT WORKING:

enter image description here

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...

service:

    <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"/>

layers:

    <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"  />

caculate extent:

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);

            }
        }

calculate position points on map

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);
            }

WORKING FINE:

enter image description here

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

layers:

<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"/>

calculate extent:

        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?


Solution

  • 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)