2013-09-01 48 views
0

我想從遠程ArcGIS服務器添加WMS圖層到我的GWT網絡應用程序。我正在使用gwt-openlayers庫。如何使用gwt-openlayers添加WMS圖層?

我的代碼:

MapOptions defaultMapOptions = new MapOptions(); 

    mapWidget = new MapWidget("100%", "100%", defaultMapOptions); 

    Map map = mapWidget.getMap(); 


    //gNormal = new GoogleV3("Google Normal", gOptions); 
    //map.addLayer(gNormal); 


    WMSParams wmsParams = new WMSParams(); 
    wmsParams.setFormat("image/png"); 
    wmsParams.setLayers("1"); 
    wmsParams.setStyles(""); 

    WMSOptions wmsLayerParams = new WMSOptions(); 
    wmsLayerParams.setUntiled(); 
    wmsLayerParams.setProjection("EPSG:3857"); // is it correct setting for WMS layer? 
    // wmsLayerParams.setProjection("EPSG:102113"); 
    // wmsLayerParams.setProjection("EPSG:4326"); 
    wmsLayerParams.setTransitionEffect(TransitionEffect.RESIZE); 


    String wmsUrl = "sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer"; 
    arcGis = new WMS("ArcGis", wmsUrl, wmsParams); 
    map.addLayer(arcGis); 
    map.setBaseLayer(arcGis); 


    LonLat lonLat = new LonLat(-84.1,36.4); //USA 

    lonLat.transform("EPSG:4326", map.getProjection()); 
    //System.out.println("map projection "+map.getProjection()); 
    map.setCenter(lonLat, 3); 

    add(mapWidget); 

我看了很多文章和SO問題,但我還是解決不了問題。我的問題是在地圖上呈現粉紅色的瓦片而不是普通的圖像。我複製圖片地址多達stackoverflow答案建議,看到以下內容:

http://localhost:8084/sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer?FORMAT=image%2Fpng&LAYERS=1&STYLES=&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG%3A4326&BBOX=-135,45,-90,90&WIDTH=256&HEIGHT=256 

沒有localhost:8084前綴網址工作正常,並表明我小片地圖。

問題:

1)如何擺脫從WMS的URL本地主機前綴?在我的代碼wmsUrl看起來像sampleserver1...所以它是正確的。看來我的應用程序將其添加到遠程URL的根路徑。

2)我讀過WMS圖層應該有以下投影 - "EPSG:3857"。這是真的嗎?正如我上面提到的,當我手動在瀏覽器中輸入正確的URL而沒有「localhost」前綴時,我看到了一些圖像,但我不確定它是否正確。圖像可能會轉移。

3)我最終的目標是在地圖上添加2層 - Google地圖圖層和WMS圖層。 Google Map使用"EPSG:900913"作爲默認投影。有人可以提供一些常見的提示,將谷歌圖層和WMS圖層放置在一張地圖上。可能有一些技巧,與預測相關的常見錯誤等。

回答

0

在wmsUrl變量中,您缺少「http://」,這可能有所幫助。 粉紅色瓷磚通常表示未找到數據源,因此這是您應該查找問題的位置。嘗試檢查您在wms查看器中提供的wms URL(例如ArcGIS Explorer)。

您的問題: 1)儘量只添加HTTP://你的網址,而本地主機

2)WMS層可以有任意投影,它完全取決於在其被投影出版。有關特定WMS投影的信息應在元數據中找到。

3)如果兩個圖層具有相同的投影,則不需要執行任何操作。如果要在一張地圖中使用不同投影中的兩個圖層,則必須重新投影其中一個圖層。在純OpenLayers中,這是通過爲每個圖層指定投影參數,然後爲地圖指定displayProjection參數來完成的。這些圖層將自動重投影。然而,重投影需要一些時間,並且非常顯着地增加了加載時間。如果可能的話,最好避免重新投影。您可以重新映射其中一個圖層的源數據並使用重投影數據。當然,這對WMS來說是不可能的,所以你應該考慮使用不同的數據源。如果您想要背景地圖,則可以下載OpenStreetMap數據,將它們重投影到您所需的投影,然後將它們與您要使用的其他WMS一起使用。

希望至少一些這有助於:-)

+0

你能分享更多一點關於同時呈現2層與GWT的OpenLayers?我在某處讀到可以從WFS服務創建Vector對象。 'FeatureType'和'FeatureNamespace'的問題 - 我可以在哪裏找到值? 'GetCapabilities'請求返回空'featureTypeList'。另外我讀了關於從WMS創建WFS,但我所有的努力都沒有成功。 – Baurzhan

+0

據我所知,從WMS創建WFS是不可能的。至少也不是「正確的」 - 它仍然會像原始的WMS一樣行事。 Vector對象也是如此。 WMS始終提供柵格數據 - 服務器根據客戶端請求處理自己的(有時是矢量)數據,並提供地理編碼的地圖圖像 - 柵格。見http://www.opengeospatial.org/standards/wms。 – Kenny806

+0

第一個問題:我沒有使用gwt-OpenLayers的經驗,我只使用javascript OpenLayers(請參閱http://www.openlayers.org)。但是同時渲染兩個或多個圖層不應僅僅需要創建圖層對象,而是將其添加到地圖中,如下所示:'wms1 = new WMS(「wms1」,wms1URL,wms1Options); wms2 =新的WMS(「wms2」,wms2URL,wms2Options); map.addLayers([wms1,WMS2]); map.setBaseLayer(wms1);' – Kenny806