1. 程式人生 > >ArcGIS for WPF下的Google圖層

ArcGIS for WPF下的Google圖層

試了一下原來SilverLight下的方法,發現直接繼承TiledMapServiceLayer然後覆蓋GetTileUrl方法是不行的,沒辦法,只好再向上繼承自TiledLayer了,需要覆蓋GetTileSource方法,也就意味著要自己做下載圖片的實現,其中有個關鍵的地方:

var web = new WebClient {Credentials = CredentialCache.DefaultCredentials};//要設定證書
web.Headers.Add(HttpRequestHeader.UserAgent, "Microsoft Internet Explorer");//要設定UserAgent

好了,下面附上cs檔案原始碼:
using System;
using System.IO;
using System.Net;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Geometry;

namespace WPF.Map
{
    public class GoogleMapTileLayer : TiledLayer
    {
        /// <summary>
        /// 切片源點的座標常量
        /// </summary>
        private const double OriginX = -20037508.342787;

        private const double OriginY = 20037508.342787;
        private int _mapType = 0;
        private int WKID = 102100;
        private string _languageCode = "zh-CN";
        private string _countryCode = "cn";
        /// <summary>
        /// 地圖型別 0:地形圖 1:衛星圖 2:街道圖
        /// </summary>
        public int MapType { get { return _mapType; } set { _mapType = value; } }

        public string LanguageCode
        {
            get { return _languageCode; }
            set { _languageCode = value; }
        }
        public string CountryCode
        {
            get { return _countryCode; }
            set { _countryCode = value; }
        }

        protected override void GetTileSource(int level, int row, int col, Action<ImageSource> onComplete)
        {
            string url, BaseUrl;
            switch (_mapType)
            {
                case 0: //地形圖
                    BaseUrl = "
[email protected]
"; url = string.Format("http://mt{0}.google.cn/vt/lyrs={1}&v=w2.114&hl={2}&gl={3}&src=app&x={4}&y={5}&z={6}&s={7}", col % 4, BaseUrl, LanguageCode, CountryCode, col, row, level, "Galileo".Substring(0, (col * 3 + row) % 8)); break; case 1: //衛星圖 BaseUrl = "
[email protected]
"; url = string.Format("http://mt{0}.google.cn/vt/lyrs={1}&v=w2.114&hl={2}&gl={3}&src=app&x={4}&y={5}&z={6}&s={7}", col % 4, BaseUrl, LanguageCode, CountryCode, col, row, level, "Galileo".Substring(0, (col * 3 + row) % 8)); break; case 2: //街道圖 BaseUrl = "[email protected]"; url = string.Format("http://mt{0}.google.cn/vt/imgtp=png32&lyrs={1}&v=w2.114&hl={2}&gl={3}&src=app&x={4}&y={5}&z={6}&s={7}", col % 4, BaseUrl, LanguageCode, CountryCode, col, row, level, "Galileo".Substring(0, (col * 3 + row) % 8)); break; default: //地形圖 BaseUrl = "[email protected]"; url = string.Format("http://mt{0}.google.cn/vt/lyrs={1}&v=w2.114&hl={2}&gl={3}&src=app&x={4}&y={5}&z={6}&s={7}", col % 4, BaseUrl, LanguageCode, CountryCode, col, row, level, "Galileo".Substring(0, (col * 3 + row) % 8)); break; } var web = new WebClient {Credentials = CredentialCache.DefaultCredentials}; web.Headers.Add(HttpRequestHeader.UserAgent, "Microsoft Internet Explorer"); web.DownloadDataCompleted += (sender, args) => { if (args.Error == null && onComplete != null) { var ms2 = new MemoryStream(args.Result, 0, args.Result.Length); ms2.Seek(0, SeekOrigin.Begin); var image = new BitmapImage(); image.BeginInit(); image.CacheOption = BitmapCacheOption.None; image.CreateOptions = BitmapCreateOptions.None; image.StreamSource = ms2; image.EndInit(); onComplete(image); } }; web.DownloadDataAsync(new Uri(url, UriKind.RelativeOrAbsolute)); } public override void Initialize() { this.FullExtent = new Envelope(-20037508.342787, -20037508.342787, 20037508.342787, 20037508.342787); { SpatialReference = new SpatialReference(WKID); }; this.SpatialReference = new SpatialReference(WKID); this.TileInfo = new TileInfo() { Height = 256, Width = 256, Origin = new MapPoint(-20037508.342787, 20037508.342787) { SpatialReference = new SpatialReference(WKID) }, Lods = new Lod[20] }; double resolution = 156543.033928; for (int i = 0; i < TileInfo.Lods.Length; i++) { TileInfo.Lods[i] = new Lod() { Resolution = resolution }; resolution /= 2; } base.Initialize(); } } }


相關推薦

ArcGIS for WPFGoogle

試了一下原來SilverLight下的方法,發現直接繼承TiledMapServiceLayer然後覆蓋GetTileUrl方法是不行的,沒辦法,只好再向上繼承自TiledLayer了,需要覆蓋GetTileSource方法,也就意味著要自己做下載圖片的實現,其中有個關鍵的

arcgis for javascript之ArcGISDynamicMapServiceLayer控制的實現

圖層控制是很多GIS系統裡面必須的一個小功能,本文就說說arcgis for javascript下ArcGISDynamicMapServiceLayer圖層控制的實現方式。首先看圖: 實現效果 重點有以下兩點:1、獲取ArcGISDynamicMapServiceLa

arcgis api for javascript graphiclayer dojo框架畫圖的顯示與清除

    首先,我們借用上一篇文章中搭建的arcgis地圖服務來做例子,並且對其進行一些少許更改。 程式碼: <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

ArcGIS API For JS 中設定顯示的方法(ArcGISDynamicMapServiceLayer)setVisibleLayers(ids, doNotRefresh?)介紹

一、我們都知道所以圖層都繼承自layer圖片,在layer圖層並沒有定義該方法,也就說該方法是子類自己定義的,並不是每個圖層都有該方法,像CSVLayer圖層有setVisibility(isVisib

Arcgis api for Javascript中多查詢(上)

在使用arcgis for javascript api 進行地圖要素查詢的過程中,發現使用QueryTask查詢,單次只能查詢單個圖層;如果需要查詢多個圖層,就必須要新建多個QueryTask物件來

ArcGIS Runtime SDK for iOS開發地圖-圖形

       建立圖形圖層        圖形圖層可以使你在地圖上動態的展示圖形。圖形圖層可以用來儲存使用者繪製的多邊形、線條,或者展示例如查詢或是地理編碼結果的屬性資訊。下圖中,圖形圖層用於突出展示每平方里超過200人的人口密度狀態:               當你想

ArcGIS API for JavaScript 面要素顯示邊界

前言     在前端我們載入的動態圖層是面要素組成的,我們希望獲得面要鎖的邊界     我們可以通過要素圖層渲染的方式完成。 效果:     我們載入省級行政區的圖層,我們想獲得省級行政區邊

ArcGIS API For Javascript之多顯示與隱藏,要素選框查詢

5、多圖層的載入與隱藏 利用Html+Javascript前端程式設計實現上傳到服務端的地圖服務中的多圖層的載入與隱藏。本實驗中除了底圖之外,添加了共10個圖層,分別為 賓館酒店_point (0) 餐飲_point (1) 超市商城_point (2) 地級市_font

ArcGIS API for JavaScript實現分顯示

大家都知道,當用ArcGIS釋出地圖服務時,是把整個地圖文件所有圖層都發布出去的,如果展示的時候只想顯示某個圖層怎麼辦呢?或許你會用FeatureLayer,這樣做當然也能實現,但是在地圖文件中

arcgis-api-for-js-之新增到地圖及地圖服務設定可見

1. 前言 ArcGISDynamicMapServiceLayer 類代表動態圖層,因此就有很大的屬性與方法來操作檢視服務。 2. 新增圖層到地圖 我們使用 addLayer() 方法將圖層載入到地圖中,程式碼如下: require([

ArcGIS JS之查詢一個的全部信息

clas link result arcgis ini var tex value add <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> &

C#基於ArcGIS Engine寫的要素工具類

用於從MapControl中獲取可見圖層、獲取指定圖層名等: using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; usi

使用python在ArcGIS中合併多個中的資料

#encoding=utf-8 #將當前圖層列表中的多個圖層的向量資料合併到一個圖層中 import arcpy   mapdoc = arcpy.mapping.MapDocument("CURRENT") dfm = arcpy.mapping.Lis

ARCGIS中如何把線和麵疊加呢?

可以通過下面的方法實現: 方法一:        如果線圖層和麵圖層是coverage資料格式,那麼只要對線圖層採用build命令,build時feature type 選擇poly -gon之後, 採用union命令,就可以與面圖層進行疊加了,形成一個新的面圖層。 方法二

ArcGIS Engine開發教程之符號化(三)——符號化Symbol(符號)體系

ArcGIS Engine9.3為開發人員提供了32種符號,主要分為三大類符號MarkerSymbol(點符號)、 LineSymbol(線符號)和FillSymbol(填充符號)來繪製地理要素的幾何圖形。此外還有兩種特殊型別的符號:一種是TextSymbol用於文字標註;

ArcGIS Online Web製圖之新增

想一下,我們使用Desktop是如何製圖的,第一步是什麼?載入圖層或者是新建工程!如果有相關的資料,就載入進去,沒有就建立一個空的圖層。 ArcGIS Online不過在這之前,我們可以做一件事情,那就是載入底圖,就像上次博文所說的那樣,新建web製圖

Arcgis---將座標不同的顯示在同一個ArcScene中

現在由2個圖層,buildings.shp 以x、y座標顯示,即投影座標,GSM900.shp 以經緯度顯示,即地理座標,如果直接放在同一個ArcScen中,則無法正常顯示,這時需要座標變換。要麼都以x、y方式顯示,要麼都以經緯度方式顯示,本文選用後者,將bui

Arcgis for Javascript之featureLayer和屬性的互操作

說明:主要實現載入FeatureLayer與顯示屬性表,並實現屬性表與地圖的聯動,首先,看看實現後的效果: 顯示效果 如上圖所示,本文章主要實現了以下幾個功能:1、FeatureLayer屬性表的分頁載入與顯示;2、屬性表和地圖的互操作,包括滑鼠經過時在地圖上顯示名稱並高

ArcGIS API for JavaScript3.x 學習筆記[8] 動態地圖服務

etl mapserver esri tex png utf ons css mes 在ArcGIS API 中給我們提供了一個類叫做ArcGISDynamicMapServiceLayer利用這個類,我們可以獲得發布的地圖服務。調用動態地圖服務一般只需要兩步: 通過地

ArcGIS小技巧——多情況互動顯示效果

在使用ArcMap處理資料的過程中,通常需要對比不同圖層之間的差異、或者檢視影像配準情況,這時我通常會懷念ENVI中的強大的拉幕顯示、閃爍、亮度和透明度顯示工具......  直到有一天,閒著沒事幹搗鼓各個工具的時候,才發現其實在ArcMap中就有一個類似的工具可以做這個工作。並且功能似乎更加