阅读:1519回复:0
[转帖]WP7 ArcGIS 地图
<div id="cnblogs_post_body"><p><strong>ArcGIS Runtime SDK for Windows Phone</strong>是
一套用于构建具有专业GIS功能、大众地图服务、LBS相关移动应用的类库。通过该类库可将地图嵌入到您的应用中,加载在线地图服务,Bing Maps或离线地图,以完成定位/搜索/空间查询/数据展示等常见功能;此外,它提供了一系列专业的GIS功能,允许您加载自己的地理数据,进行数据采集 /编辑,执行复杂的地理分析任务,从而挖掘数据的潜在价值。</p> <p>摘自:<a href="http://msdn.microsoft.com/zh-cn/windowsphone/partner">http://msdn.microsoft.com/zh-cn/windowsphone/partner</a></p> <h2>准备</h2> <p>SDK下载地址:<a href="http://resources.arcgis.com/zh-cn/content/arcgis-api-windows-phone-24-download">http://resources.arcgis.com/zh-cn/content/arcgis-api-windows-phone-24-download</a></p> <p>帮助文档<a href="http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/help/index.html">http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/help/index.html</a></p> <p>这个帮助文档不得不说一下,很好很强大~~~特别喜欢Sample那一栏</p> <p>中国数据服务地址 :<a href="http://www.arcgisonline.cn/agsolcn/service/map/countrymap2.jsp">http://www.arcgisonline.cn/agsolcn/service/map/countrymap2.jsp</a></p> <p>中国的地图数据服务很棒,有各种色调版本,很有爱,哈哈</p> <p>再一个需要准备的资料是坐标纠偏了,这个~~~~不想多说了,最近看美谍战剧,一个美特务威胁果戈理说:你要不把东西给我,我就把你的人送到中国监狱,栽赃他危害国家总统~~~果戈里无语了~~,没有纠偏,阿果连监狱都找不到~~~</p> <h2>基本知识点</h2> <ul><li> <h6>基本的地图加载</h6> </li></ul> <div class="csharpcode"> <pre class="alt"><span class="kwrd"><</span><span class="html">esri:Map</span> <span class="attr">x:Name</span><span class="kwrd">="map"</span> <span class="attr">IsLogoVisible</span><span class="kwrd">="False"</span> <span class="attr">Extent</span><span class="kwrd">="12915510.1474625, 4827746.45379021, 12998675.8823845,4877354.08514722"</span><span class="kwrd">></span></pre> <pre> <span class="kwrd"><</span><span class="html">esri:Map.Layers</span><span class="kwrd">></span></pre> <pre class="alt"> <span class="kwrd"><</span><span class="html">local:OfflineArcGISTiledMapServiceLayer</span> <span class="attr">ID</span><span class="kwrd">="StreetMapLayer"</span> <span class="attr">Url</span><span class="kwrd">="http://www.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer"</span><span class="kwrd">/></span></pre> <pre> <span class="kwrd"><</span><span class="html">esri:GraphicsLayer</span> <span class="attr">ID</span><span class="kwrd">="MyGraphicsLayer"</span> <span class="kwrd">/></span></pre> <pre class="alt"> <span class="kwrd"></</span><span class="html">esri:Map.Layers</span><span class="kwrd">></span></pre> <pre><span class="kwrd"></</span><span class="html">esri:Map</span><span class="kwrd">></span></pre> <pre class="alt"> </pre> </div> <p>IsLogoVisible="False" 隐藏Logo,其实ArcGIS的LOGO还是蛮漂亮的,哈</p> <ul><ul><li> <h6>在地图上添加自定义图形</h6> <div class="csharpcode"> <pre class="alt"><span class="kwrd">private</span> GraphicsLayer graphicsLayer { get { <span class="kwrd">return</span> mapFeet.Layers[<span class="str">"MyGraphicsLayer"</span>] <span class="kwrd">as</span> GraphicsLayer; } }</pre> <pre><span class="kwrd">private</span> <span class="kwrd">static</span> WebMercator mercator = <span class="kwrd">new</span> WebMercator();</pre> <pre class="alt">var myPoint = mercator.FromGeographic(<span class="kwrd">new</span> MapPoint(point.X, point.Y, <span class="kwrd">new</span> SpatialReference(4326)));</pre> <pre>Graphic graphic = <span class="kwrd">new</span> Graphic()</pre> <pre class="alt">{</pre> <pre> Geometry = myPoint,</pre> <pre class="alt"> Symbol = <span class="kwrd">this</span>.Resources[<span class="str">"RedMarkerSymbol"</span>] <span class="kwrd">as</span> Symbol</pre> <pre>};</pre> <pre class="alt">graphicsLayer.Graphics.Add(graphic);</pre> </div> <h6> </h6> </li></ul></ul> <p>//这个图形只能是园,方框等,如果其他,只能用图片</p> <p><esriSymbols:PictureMarkerSymbol x:Key="BlueMarkerSymbol" Source="/Images/fuck.png" /></p> <p><esriSymbols:SimpleMarkerSymbol x:Key="RedMarkerSymbol" Color="Red" Size="20" Style="Circle" /></p> <p>用这个添加元素有个好处,效率高,比在图层上话UIElement效率要高的多,我搞了200多个fuck.png都很快</p> <ul><li> <h6>地图缓存</h6> </li></ul> <p>OfflineArcGISTiledMapServiceLayer 是参考菩提老王的博客重写的一个缓存图片的Layer</p> <p>代码如下:</p> <div class="csharpcode"> <pre class="alt"> <span class="kwrd">public</span> <span class="kwrd">class</span> OfflineArcGISTiledMapServiceLayer : ArcGISTiledMapServiceLayer</pre> <pre> {</pre> <pre class="alt"> <span class="kwrd">private</span> <span class="kwrd">const</span> <span class="kwrd">string</span> c_fileName = <span class="str">"MapTiles\\{0}_{1}_{2}.jpg"</span>;</pre> <pre> </pre> <pre class="alt"> <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> GetTileSource(<span class="kwrd">int</span> level, <span class="kwrd">int</span> row, <span class="kwrd">int</span> col, Action<ImageSource> onComplete)</pre> <pre> {</pre> <pre class="alt"> <span class="kwrd">string</span> fileName = <span class="kwrd">string</span>.Format(c_fileName, level, row, col);</pre> <pre> </pre> <pre class="alt"> FileStream fileStream = <span class="kwrd">null</span>;</pre> <pre> <span class="kwrd">if</span> (Isolated.FileExist(fileName) ;; Isolated.ReadFile(fileName, <span class="kwrd">out</span> fileStream))</pre> <pre class="alt"> {</pre> <pre> BitmapImage image = <span class="kwrd">new</span> BitmapImage()</pre> <pre class="alt"> {</pre> <pre> CreateOptions = BitmapCreateOptions.DelayCreation</pre> <pre class="alt"> };</pre> <pre> image.SetSource(fileStream);</pre> <pre class="alt"> onComplete(image);</pre> <pre> }</pre> <pre class="alt"> <span class="kwrd">else</span></pre> <pre> {</pre> <pre class="alt"> <span class="kwrd">base</span>.GetTileSource(level, row, col, onComplete);</pre> <pre> }</pre> <pre class="alt"> }</pre> <pre> </pre> <pre class="alt"> <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Initialize()</pre> <pre> {</pre> <pre class="alt"> <span class="kwrd">base</span>.Initialize();</pre> <pre> <span class="kwrd">base</span>.TileLoaded += <span class="kwrd">new</span> EventHandler<TileLoadEventArgs>(OfflineArcGISTiledMapServiceLayer_TileLoaded);</pre> <pre class="alt"> }</pre> <pre> </pre> <pre class="alt"> <span class="kwrd">void</span> OfflineArcGISTiledMapServiceLayer_TileLoaded(<span class="kwrd">object</span> sender, TiledLayer.TileLoadEventArgs e)</pre> <pre> {</pre> <pre class="alt"> <span class="kwrd">string</span> fileName = <span class="kwrd">string</span>.Format(c_fileName, e.Level, e.Row, e.Column);</pre> <pre> <span class="kwrd">if</span> (e.ImageStream != <span class="kwrd">null</span> ;; Isolated.FileExist(fileName) == <span class="kwrd">false</span>)</pre> <pre class="alt"> {</pre> <pre> Isolated.SaveFile(fileName, e.ImageStream);</pre> <pre class="alt"> }</pre> <pre> }</pre> <pre class="alt"> }</pre> </div> <h2>总的来说</h2> <p>之前一直用BingMap控件引Google的数据源,后来发现不能做缓存~~~就放弃了,其实BingMap的操控流畅比ArcGIS要好,不过 缓存是硬伤,没办法,好处是ArcGis的效率还不错,特别是我需要在Map上加载很多东西的时候,BingMap就会变慢,可能是我处理的方式不太 对~~~</p> <p>哦,还有MapABC的大家也可以参考</p> <p>总的来说:ArcGis的缓存还是很棒的,哈哈</p></div><div id="MySignature">http://blog.bryht.net</div> |
|
|