2013-09-01 5 views
0

Я пытаюсь добавить слой WMS с удаленного сервера ArcGIS в мое веб-приложение GWT. Я использую библиотеку gwt-openlayers.Как добавить слои WMS с gwt-openlayers?

Мой код:

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); 

Я прочитал много статей и так вопросы, но я до сих пор не может решить эту проблему. Моя проблема заключается в рендеринг розовых плит на карте вместо обычного изображения. Я скопировал URL изображения, как много 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 префикса URL отлично работает и показывает мне небольшой кусок карты.

Вопросы:

1) Как избавиться от LOCALHOST приставки WMS URL? В моем коде wmsUrl выглядят как sampleserver1..., так что это правильно. Похоже, мое приложение добавляет, что это корневой путь к удаленному URL-адресу.

2) Я прочитал, что слои WMS должны иметь следующий проектор - "EPSG:3857". Это правда? Как я упоминал выше, когда я вручную помещал в браузер правильный URL-адрес без префикса «localhost», я видел некоторое изображение, но я не уверен, что это правильно. Вероятно, изображение смещено.

3) Моя конечная цель - добавить 2 слоя к карте - слой Google Map и слой WMS. Карта Google использует "EPSG:900913" в качестве проекции по умолчанию. Может ли кто-нибудь дать общие советы по размещению слоя google и уровня WMS на одной карте. Может быть, есть некоторые трюки, распространенные ошибки, связанные с проекциями и так далее.

ответ

0

В переменной wmsUrl отсутствует сообщение "http: //", которое может помочь. Розовые плитки обычно означают, что источник данных не найден, поэтому здесь вы должны искать проблему. Попробуйте проверить URL-адрес wms, который вы подаете в средстве просмотра wms (например, ArcGIS Explorer).

на вопросы: 1) попробуйте просто добавив HTTP: // на ваш URL, без локального сервера

2) слой WMS может иметь любую проекцию, это зависит только от проекции, в которой он был опубликован. Информация о конкретной проекции WMS должна быть найдена в метаданных.

3) Если два слоя имеют одинаковую проекцию, вам ничего не нужно делать. Если вы хотите использовать два слоя в разных проекциях на одной карте, один из слоев должен быть перепрограммирован. В чистых OpenLayers это делается путем указания параметра проекции для каждого слоя, а затем указания параметра displayProjection для карты. Слои будут автоматически перепрограммированы. Однако повторное воспроизведение занимает некоторое время и увеличивает время загрузки ОЧЕНЬ значительно. Лучше избегать перепрограммирования «на лету», если это возможно. Вы можете либо перепрограммировать исходные данные одного из слоев, либо использовать перепрограммированные данные. Конечно, это невозможно для WMS, поэтому вам следует рассмотреть возможность использования другого источника данных. Если вам нужна карта фона, вы можете загрузить данные OpenStreetMap, перепрограммировать их на желаемую проекцию, а затем использовать их с другой WMS, которую хотите использовать.

Надежда по крайней мере, некоторые это помогает :-)

+0

Не могли бы вы поделиться немного больше о рендеринга 2 слоев одновременно с GWT OpenLayers? Я где-то читал, что можно создать объект «Вектор» из службы WFS. Проблемы с 'FeatureType' и' FeatureNamespace' - где я могу найти значения? Запрос GetCapabilities возвращает пустой 'featureTypeList'.Также я читал о создании WFS из WMS, но все мои усилия были безуспешными. – Baurzhan

+0

Насколько я знаю, создать WFS из WMS невозможно. По крайней мере, ни «правильный» - он все равно будет вести себя так же, как оригинальная WMS. То же самое касается объектов Vector. WMS всегда предоставляет растровые данные - сервер обрабатывает свои собственные, иногда векторные, данные на основе клиентского запроса и предоставляет изображение геокодированной карты - растр. См. Http://www.opengeospatial.org/standards/wms. – Kenny806

+0

К вашему первому вопросу: у меня нет опыта работы с gwt-OpenLayers, я работал только с javascript OpenLayers (см. Http://www.openlayers.org). Но при одновременном рендеринге двух или более слоев не требуется больше, чем создание объекта слоя, а затем добавление его к карте, например: wms1 = новая WMS («wms1», wms1URL, wms1Options); wms2 = новая WMS («wms2», wms2URL, wms2Options); map.addLayers ([wms1, wms2]); map.setBaseLayer (wms1); ' – Kenny806