WFS в MapServer

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
taskmgr
Интересующийся
Сообщения: 18
Зарегистрирован: 16 апр 2010, 06:52
Репутация: 0

WFS в MapServer

Сообщение taskmgr » 18 апр 2010, 08:27

Использую OL + MapServer. Карта WMS работает прекрасно. Хочется сделать интерактивное выделение объектов, как в примере http://openlayers.org/dev/examples/getfeature-wfs.html.
На клиенте:

Код: Выделить всё

<html>
<head>
  <title>Fuck my brain!</title>
    <script src="http://openlayers.org/api/OpenLayers.js"></script>
    </head>
    <body>
    
      <div style="width:100%; height:100%" id="map"></div>
      
      <script defer="defer" type="text/javascript">
        var map = new OpenLayers.Map('map');
        
        var wms = new OpenLayers.Layer.WMS(
          "OpenLayers WMS",
          "http://taskmgr/cgi-bin/mapserv.exe", 
          {
            map: 'W:\\ABL\\Map\\nsk.map',
            layers: 'districts'
          },
          {
             maxExtent: new OpenLayers.Bounds(597408,6072104,652389,6123575),
             maxResolution: "auto", 
             units: "m"                  
          }
        );
        
        select = new OpenLayers.Layer.Vector(
          "Selection", 
          {styleMap: new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"])}
        );
        
        map.addLayers([wms, select]);

        control = new OpenLayers.Control.GetFeature(
        {
          protocol: new OpenLayers.Protocol.WFS(
            {
              version: "1.1.0",
              url: "http://taskmgr/cgi-bin/mapserv.exe",
              featureType: "districts",
              srsName: "EPSG:4326",
              extractAttributes: false
            }
          ),
          box: true,
          hover: false,
          multipleKey: "shiftKey",
          toggleKey: "ctrlKey"
        });
        
        control.events.register("featureselected", this, function(e) {
          select.addFeatures([e.feature]);
        });
        control.events.register("featureunselected", this, function(e) {
          select.removeFeatures([e.feature]);
        });
        
        map.addControl(control);
        control.activate();
        
        map.zoomToMaxExtent();
        
      </script>

</body>
</html>
На сервере:

Код: Выделить всё

MAP
  IMAGETYPE	PNG
  EXTENT		597408.85 6072223.67 652389.48 6123575.00
  SIZE		800 800
  SHAPEPATH	"."
  IMAGECOLOR	255 255 255
  
  WEB
    IMAGEPATH "/ms4w/tmp/ms_tmp/"
    IMAGEURL "/ms_tmp/"
    METADATA
      "wfs_title"            "WFS Server"
      "wfs_onlineresource"   "http://taskmgr/cgi-bin/mapserv.exe?" 
      "wfs_srs"              "EPSG:4326"
      "gml_include_items"    "all" 
    END
  END
  
  PROJECTION
    "init=epsg:4326"
  END
  LAYER
    NAME districts
    DATA Novosibirsk_districts.shp
    STATUS ON
    DUMP true
    TYPE POLYGON
    CLASS
      STYLE
        COLOR 239 227 173
        OUTLINECOLOR 100 100 100
      END
    END  
  END
END
Когда мышой в браузере растягиваю квадрат выделения, то в FireBug-е видно, что вместо GET или POST запроса на сервер отправляется запрос OPTIONS с URL http://taskmgr/cgi-bin/mapserv.exe (без параметров вообще). Сервер возвращает "200 OK", и все, дальше ничего не происходит. Догадываюсь, что это не правильно.
Где же я туплю?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: WFS в MapServer

Сообщение Mavka » 18 апр 2010, 18:25

Убедитесь что на UMN правильно работает сервис WFS. Подключитесь к нему из QGis или др. подобного.
лангольеры под окном жрали время ом-ном-ном

taskmgr
Интересующийся
Сообщения: 18
Зарегистрирован: 16 апр 2010, 06:52
Репутация: 0

Re: WFS в MapServer

Сообщение taskmgr » 18 апр 2010, 19:36

Спасибо, я не знал, чем проверить работу WFS. Завтра посмотрю.
Хотя, почему-то думаю, что дело в OL на стороне клиента. Так как POST-запрос, как в приведенном выше примере со штатами, WFS серверу вообще не посылается.

taskmgr
Интересующийся
Сообщения: 18
Зарегистрирован: 16 апр 2010, 06:52
Репутация: 0

Re: WFS в MapServer

Сообщение taskmgr » 19 апр 2010, 09:20

Вау! Установил Quantum GIS. Весьма приятный, дружелюбный интерфейс.
Только я не понял, как соединиться с WFS?
Для WMS выбираю "Слой"/"Добавить WMS-слой", добавляю сервер и все красиво отображается.
А где добавить WFS? Пробовал "Слой"/"Добавить векторный слой"/"Протокол", но там только GeoJSON, а это вроде не совсем то, что нужно.
Может надо что-то дополнительно поставить, или как?

taskmgr
Интересующийся
Сообщения: 18
Зарегистрирован: 16 апр 2010, 06:52
Репутация: 0

Re: WFS в MapServer

Сообщение taskmgr » 19 апр 2010, 10:08

Нашел, включил WFS плагин, районы города отображаются! (Правда почему-то через WFS не видно два самых северных района, но может что-то с экстентом напутал в map-файле). Но в принципе, WFS сервис работает!
Я думаю, что у меня что-то в OL неправильно. Уже три дня бъюсь, но не могу понять, что :-(

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: WFS в MapServer

Сообщение Mavka » 19 апр 2010, 10:15

Кажется понял - не указан прокси.
У меня в аналогичном проекте отправляет запрос типа POST.
лангольеры под окном жрали время ом-ном-ном

taskmgr
Интересующийся
Сообщения: 18
Зарегистрирован: 16 апр 2010, 06:52
Репутация: 0

Re: WFS в MapServer

Сообщение taskmgr » 19 апр 2010, 10:39

ProxyHost требуется, если мы добываем данные с другого сервера, а не с того, откуда загружена страница. Этим обходится ограничение безопасности XMLHttpRequest в JavaScript. В данном случае он вроде как не нужен. WMS же без него прекрасно работает.

taskmgr
Интересующийся
Сообщения: 18
Зарегистрирован: 16 апр 2010, 06:52
Репутация: 0

Re: WFS в MapServer

Сообщение taskmgr » 21 апр 2010, 18:11

Каким-то образом заработало. Сам не очень понял, почему. Но как минимум, надо было указать WFS серверу, какой map-файл использовать.
protocol: new OpenLayers.Protocol.WFS(
{
version: "1.1.0",
url: "http://taskmgr/cgi-bin/mapserv.exe?MAP=W:\\ABL\\Map\\nsk.map&",
featureType: "districts",
srsName: "EPSG:4326",
extractAttributes: false
}
То есть получается, что для WMS-сервиса карта указывается в options, а здесь приходится писать ее прямо в URL.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: WFS в MapServer

Сообщение Mavka » 20 окт 2010, 11:40

Опять столкнулся со старой багой "запросы типа POST" в WFS - Ticket #3235
В 5.6.4 исправили, 5.7-dev (от FWTools) - нет.
лангольеры под окном жрали время ом-ном-ном

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей