轉(zhuǎn)帖|其它|編輯:郝浩|2011-02-18 13:12:16.000|閱讀 4507 次
概述:在Silverlight API中不僅可以輕松使用ArcGIS Server9.3發(fā)布的地圖服務(wù),也可以通過繼承相應(yīng)的圖層,引入其他的數(shù)據(jù)源,比如ArcGIS Server9.2發(fā)布的地圖服務(wù),WMS服務(wù),或者其他免費(fèi)的數(shù)據(jù)。本節(jié)就通過一個(gè)實(shí)例,來看看如何將Google Map作為底圖數(shù)據(jù)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在Silverlight API中不僅可以輕松使用ArcGIS Server9.3發(fā)布的地圖服務(wù),也可以通過繼承相應(yīng)的圖層,引入其他的數(shù)據(jù)源,比如ArcGIS Server9.2發(fā)布的地圖服務(wù),WMS服務(wù),或者其他免費(fèi)的數(shù)據(jù)。本節(jié)就通過一個(gè)實(shí)例,來看看如何將Google Map作為底圖數(shù)據(jù)。
Google Map是經(jīng)過緩存的數(shù)據(jù),所以需要繼承的是TiledMapServiceLayer。那么在擴(kuò)展這個(gè)圖層的時(shí)候需要做哪些工作呢?首先就要明白地圖緩存的原理。可以看出我們繼承的這個(gè)圖層,需要收集到以下幾個(gè)信息:
1、Tiling Scheme Origin;
2、切圖的范圍,也就是FullExtent;
3、SpatialReference;
4、TileInfo,包括切圖的大小,級數(shù),以及每級的Resolution;
5、最后就是重寫GetTileUrl方法。
這是為什么呢?可以想象,當(dāng)?shù)貓D控件的范圍改變時(shí),能夠獲取到當(dāng)前范圍的信息,那么只要把左上角和右下角之間的Tile全部按順序顯示出來就行了。由前面的文章可以看出,當(dāng)圖層獲取了1、2、3、4四個(gè)信息后,圖層完全可以自動(dòng)計(jì)算出所需的Tile,最后根據(jù)GetTileUrl方法取回這些Tile顯示出來即可。
那么對于Google Map的前4個(gè)參數(shù),如何取得呢?記得在Catalog中做緩存時(shí),有一個(gè)LoadTiling Scheme from Google Map嗎?按照這個(gè)TilingScheme將一個(gè)地圖服務(wù)做緩存,然后查看它的conf.xml和ServiceDirectory,便完全可以取得這幾個(gè)參數(shù)了。另外關(guān)于如何獲取Google Map的緩存,網(wǎng)上已經(jīng)有非常多方法,這里就不再討論了。
代碼如下:
CODE:
public class GoogleMap:TiledMapServiceLayer
{
public override void Initialize()
{
this.FullExtent = new
ESRI.ArcGIS.Geometry.Envelope(-20037508.342787,-20037508.342787,20037508.342787,20037508.342787);//(-180,
-85.0511287798066,180, 85.0511287798066)
{
SpatialReference = new ESRI.ArcGIS.Geometry.SpatialReference(102113);
};
this.SpatialReference = new ESRI.ArcGIS.Geometry.SpatialReference(102113);
//this.InitialExtent = this.FullExtent;
this.TileInfo = new TileInfo()
{
Height = 256,
Width = 256,
Origin = new ESRI.ArcGIS.Geometry.MapPoint(-20037508.342787,
20037508.342787)//Origin = new ESRI.ArcGIS.Geometry.MapPoint(-180, 90)
{
SpatialReference = new ESRI.ArcGIS.Geometry.SpatialReference(102113)
},
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();
}
public override string GetTileUrl(int level, int row, int col)
{
//google maps map
//string baseUrl = "//mt0.google.com/mt/v=ap.92&hl=zh-CN&x=";
//string url = baseUrl + col.ToString() + "&y=" + row.ToString() + "&z=" + level.ToString() + "&s=";
//return url;
////google maps satallite
string baseUrl = "//khm2.google.com/kh/v=38&hl=zh-CN&x=";
string url = baseUrl + col.ToString() + "&y=" + row.ToString() + "&z=" + level.ToString() + "&s=";
return url;
}
}
需要注意一點(diǎn),Google Map采用的是WGS 1984 Web Mercator投影,這個(gè)投影的wkid在RESTAPI中查不到,但在ServiceDirecotry中可以找到,是102113。另外,重寫DynamicMapServiceLayer也是基本相同的。
之后也可以按照這個(gè)Tiling Scheme對自己的服務(wù)作緩存,自己的數(shù)據(jù)和Google Map便可以疊加在一起了。但是這樣子使用GoogleMap的數(shù)據(jù)不僅擔(dān)心會(huì)被封IP,而且更重要的是版權(quán)問題,畢竟不像JS API(有ArcGIS JavaScript Extension forthe Google Maps API )或者Flex API(有Google Map API forFlex)。別忘了MS有自己的Virtual Earth,下一節(jié)中就來看看如何在我們的程序中名正言順的使用VE的數(shù)據(jù)吧
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載