地圖客戶端
地圖客戶端是用來顯示地圖和實現(xiàn)交互的,采用的技術(shù)和實現(xiàn)的方式多種多樣,有Flash,Silverlight,Javascript等等,此外,別忘了桌面客戶端也屬于其范疇。
而具體基于這些技術(shù)的第三方插件有很多,開源的有如DeepEarth、SharpMap、Gmap.net、Greatmap、OpenLayer,如果細(xì)心的話,會發(fā)現(xiàn)提及的大多基于.net技術(shù)的,沒錯,個人偏向所致吧,對比過基于Deepzoom實現(xiàn)及Javascript實現(xiàn)的地圖效果后,我傾向于Deepzoom(Silverlight版地圖基本采用),當(dāng)然,如果說考慮到用戶體驗(要安裝瀏覽器插件),用Javascript或許會是更好的選擇。若了解原理,展現(xiàn)方式不同,內(nèi)在其實也大同小異的。簡單描述下,僅作為參考:SharpMap對于桌面應(yīng)用更有名些,我對它最后一次了解也是很久之前了,現(xiàn)在不知道變成怎樣了,它集成了很多開源項目,包括GDAL、.net版的JTS(NJTS)等,但是個人對其渲染效果和性能不怎么滿意。DeepEarth是比較有名的webClient,渲染效果不錯,但功能不足,需要自己開發(fā)定制很多GIS常用功能。Gmap.net貌似比較強(qiáng)大,就是參考資料太少。OpenLayers是基于Javascript的……有興趣的可以了解一下……最后來個筆鋒一轉(zhuǎn),會不會覺得很坑?——我用的是arccgis
api for silverlight,原因很簡單,功能強(qiáng)大,足夠我使用……
搭建DEMO
先來看看搭建Demo的效果圖:
silverlight實現(xiàn)
wpf實現(xiàn)
怎么實現(xiàn)的呢,步驟如下:
1、免費注冊arcgis開發(fā)者,下載Arcgis api for silverlight的SDK(我順便下載了Arcgis api for WPF的SDK),其實所謂的SDK,只要得到幾個DLL就行了,只要別人有了,直接拷貝過來引用就可以了。注:若不喜歡,完全可以用DeepEarth來代替
2、建一個silverlight的項目,把DLL引用進(jìn)去,然后創(chuàng)建一個類GoogleMapLayer.cs,內(nèi)容如下,代碼比較好理解,也不寫注釋了。特別留意一下GetTileUrl方法,采用的url是網(wǎng)上google瓦片服務(wù)地址,注釋掉的第一行url是本地緩存離線瓦片地圖,第二行url是第三節(jié)提到過的geoserver提供的wms服務(wù),也就是說可以根據(jù)需求定制自己的地圖層。
-
public class GoogleRoadLayer : TiledMapServiceLayer
-
{
-
SpatialReference _spatialReference = new SpatialReference(102113);
-
public override void Initialize()
-
{
-
this.FullExtent = new Envelope(-20037508.342787, -20037508.342787, 20037508.342787, 20037508.342787)
-
{
-
SpatialReference = _spatialReference
-
};
-
this.SpatialReference = _spatialReference;
-
this.TileInfo = new TileInfo()
-
{
-
Height = 256,
-
Width = 256,
-
Origin = new MapPoint(-20037508.342787, 20037508.342787)//Origin = new ESRI.ArcGIS.Geometry.MapPoint(-180, 90)
-
{
-
SpatialReference = _spatialReference
-
},
-
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)
-
{
-
//設(shè)置默認(rèn)值
-
string url = string.Format("http://mt{0}.google.cn/vt/lyrs=m@163000000&hl=zh-CN&gl=cn&x={1}&s=&y={2}&z={3}&s=", row % 4, col, row, level);
-
//string url = string.Format("http://192.168.4.164:8083/{2}/{0}_{1}.png", col, row, level);
-
//string url = string.Format("http://localhost:10100/geoserver/cq/wms?service=WMS&version=1.1.0&request=GetMap&layers=cq:landview&styles=&bbox={0},{1},{2},{3}&width=512&height=473&srs=EPSG:4326&format=image/png";
-
return url;
-
}
-
}
3、在MainPage.xaml(可以新建一個頁面)的Grid標(biāo)簽,加入以下內(nèi)容,至此一個擁有放大縮小、平移、滾輪支持的基本地圖瀏覽程序就完成了 - <esri:Map x:Name="map" Background="White" WrapAround="true" IsLogoVisible="False" >
- <esri:Map.Layers>
- <esri:LayerCollection>
- <local:GoogleRoadLayer ID="TileLayer"/>
- </esri:LayerCollection>
- </esri:Map.Layers>
- </esri:Map>
|