iShare 技术 ArcGIS Flex Map Resize

4
需求 在改变地图大小后, 要让地图的中心点也要跟着改变(即将地图移动到容器新的中心位置) 默认行为 ArcGIS Flex API Map 在改变地图大小后不会移动地图, 还是待在原处, 地图容器大小确实变 化了(由比例尺和 logo 的位置看出)

Transcript of iShare 技术 ArcGIS Flex Map Resize

Page 1: iShare 技术 ArcGIS Flex Map Resize

需求

在改变地图大小后, 要让地图的中心点也要跟着改变(即将地图移动到容器新的中心位置)

默认行为

ArcGIS Flex API Map 在改变地图大小后不会移动地图, 还是待在原处, 地图容器大小确实变

化了(由比例尺和 logo 的位置看出)

Page 2: iShare 技术 ArcGIS Flex Map Resize

解决思路

我试过改变地图大小后重新绘制(refresh)每个图层, 似乎能够达到目的, 但只是暂时的, 地

图好像无法包容住图层, 又反弹回去了(resize 前的位置), hold 不住啊!

只好边想边在网上找资料, 终于发现了可行的解决方案

Zooming to extent not working properly after resizing the map

It waits until aextentChange happens after a resize since the Map's own resize handler is

changing the map's extent.

The need to wait a frame by using callLater() is a bug.

原来 resize 之后会改变 Map 的 extent, 因此 resize 之后马上刷新图层只能暂时将地图移动到

中心位置, 但 extent 改变后, 又会还原回去.

实现步骤

1. 监听地图 resize 事件, 记录地图 resize 之前 extent 的中心点, 并监听 extentChange

2. 在 extentChange 事件中通过 callLater 设置地图的中心点为 resize 之前的中心点

完整代码

<?xml version="1.0" encoding="utf-8"?>

<mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"

xmlns:esri="http://www.esri.com/2008/ags"

layout="absolute">

<mx:Script>

<![CDATA[

importcom.esri.ags.events.ExtentEvent;

importcom.esri.ags.geometry.MapPoint;

Page 3: iShare 技术 ArcGIS Flex Map Resize

privatevarcenter:MapPoint;

privatefunctionbuttonClickHandler():void {

if (toggleButton.selected) {

map.percentWidth = 100;

} else {

map.percentWidth = 50;

}

}

privatefunctionmapResizeHandler():void {

// 地图初始化加载时会触发一次resize事件, 但地图还未load完成

// 初始地图会自动调整中心点到地图容器中心位置, 因此不需要手动调整

if (map.loaded) {

trace("这里还是地图resize之前的extent", map.extent);

trace("我们想要地图定位到该中心点", map.extent.center);

center = map.extent.center;

map.addEventListener(ExtentEvent.EXTENT_CHANGE, mapExtentChangeHandler);

}

}

privatefunctionmapExtentChangeHandler(event:ExtentEvent):void {

map.removeEventListener(ExtentEvent.EXTENT_CHANGE, mapExtentChangeHandler);

// 如果不callLater, 会有bug(地图缩放时中心点偏移)

callLater(function(center:MapPoint):void {

trace("地图resize之后会改变地图的extent", map.extent);

trace("地图resize之后extent的中心点", map.extent.center);

map.centerAt(center);

}, [center]);

}

]]>

</mx:Script>

<esri:Map id="map" resize="mapResizeHandler()"

width="50%" height="100%" borderColor="0xfff" borderStyle="solid">

<esri:ArcGISTiledMapServiceLayer

url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/Ma

pServer" />

Page 4: iShare 技术 ArcGIS Flex Map Resize

</esri:Map>

<mx:Button id="toggleButton" label="100%" click="buttonClickHandler()" toggle="true"

/>

</mx:Application>

最终效果