Страница 1 из 2

Shape file + Mapserver + OpenLayers

Добавлено: 10 май 2014, 13:22
xen87
Здравствуйте, уважаемые пользователи форума!
Подскажите пожалуйста решение: необходимо отобразить ряд шейп-файлов на подложке из ОпенСтритМап.
На Гис-лабе много статей, посвященных и Mapserver и OpenLayers (большое спасибо авторам), но прочитав их и поэксперимент над .map и .html - к решению я так и не приблизился. Вот что у меня получилось:
.map file:

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

MAP
  NAME        "mapserver_tutorial_wms_server"
  IMAGETYPE   PNG
  EXTENT      139.72520 35.67139 139.78845 35.70731       
  SIZE        550 450

  IMAGECOLOR  255 255 255
  SHAPEPATH   "../data"

  FONTSET     ../fonts/fonts.txt

  UNITS dd

  WEB	
    TEMPLATE  'example_template.html'
    IMAGEPATH "C:\OSGeo4W/tmp/ms_tmp/"
    IMAGEURL "/ms_tmp/"
    MINSCALEDENOM  1000
    MAXSCALEDENOM  70000
    METADATA
      "wms_title"          "MapServer Tutorial WMS Server"
      "wms_onlineresource" "http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:\OSGeo4W/apps/mapserver-tutorial/example12.map"
      "wms_srs"            "EPSG:4301 EPSG:4269 EPSG:4326"
      "wms_abstract"       "This demonstration server shows how to setup a MapServer .map file to serve data through the WMS standard."
    END    
  END
  
  PROJECTION
    "init=epsg:4326"
  END  


  LAYER 
    NAME "places"
    METADATA
    "wms_title"    "Place name"
    END     
    DATA chimei_epsg_4326 
    STATUS ON
    TYPE POINT
    LABELITEM "NAMAE"
    CLASS
      NAME "Places"
      STYLE
        COLOR 10 100 100
      END
      LABEL
        TYPE TRUETYPE
        FONT pgothic
        COLOR 220 20 20
        SIZE 7
        POSITION CL
        PARTIALS FALSE
        BUFFER 5
        ENCODING "SHIFT_JIS"                              
      END
    END
    PROJECTION
      "init=epsg:4326"
    END    
  END 

END 
.html file:

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

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
    <link rel="stylesheet" href="style.css" type="text/css" />
    <style type="text/css">
        #map {
         width: 800px;
            height: 500px;
            border: 1px solid black;
        }
    </style>
    <script src="OpenLayers.js"></script>
    <script type="text/javascript">
        var lon = 139.72520;
        var lat = 35.67139;
        var zoom = 11;
        var map, layer, localWMS ;
        function init(){
            map = new OpenLayers.Map( 'map');
            layer = new OpenLayers.Layer.OSM( "Simple OSM Map");
            
            localWMS = new OpenLayers.Layer.WMS( "Local WMS layers",
			          "http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:/OSGeo4W/apps/mapserver-tutorial/example12/example_4326.map",
			          {layers: 'mapserver_tutorial_wms_server', transparent: true}, {isBaseLayer: false});

            
            map.addLayer(layer);
            map.setCenter(
                new OpenLayers.LonLat(lon, lat).transform(
                    new OpenLayers.Projection("EPSG:4326"),
                    map.getProjectionObject()
                ), zoom
            );    
        }
    </script>
  </head>
  <body onload="init()">
    <h1 id="title">OpenLayers Example</h1>

    <div id="tags">
    </div>
    <p id="shortdesc">
        Shows the basic use of OpenLayers with our local WMS layers and a GeoGrid WMS layer.
    </p>

    <div id="map" class="smallmap"></div>

    <div id="docs">
        OpenLayers is a JavaScript file (OpenLayers.js) that can be easily included in any HTML file.<br>Click on the source
        below to see the few lines required to add these 2 WMS servers into the map.<br>
          <br>
          <hr noshade width="40%" size="1" align="left">
          <a href="/mapserver-tutorial/example14/openlayers_source.html">- (source) -</a>&nbsp;&nbsp;
          <a href="/mapserver-tutorial/index.html">- (back) -</a>
    </div>
  </body>
</html>
В итоге: слой "layer" - в браузере выводиться (т.е. подложка ОСМ), а слой: "localWMS" - в браузере не выводиться (т.е. слой с шейп-файлом).
Шейп перепроицировал epsg : 4326, экстент и охват вроде настроены верно.
Видимо не верно составлен .map файл или я не верно к нему обращаюсь в .html
Подскажите пожалуйста, третий день бьюсь.

Re: Shape file + Mapserver + OpenLayers

Добавлено: 10 май 2014, 14:42
Denis Rykov
Ваш WMS сервис не поддерживает проекцию 3857 (проекция ОСМ).

[ Сообщение с мобильного устройства ]

Re: Shape file + Mapserver + OpenLayers

Добавлено: 10 май 2014, 16:09
xen87
Ваш WMS сервис не поддерживает проекцию 3857 (проекция ОСМ).
Денис, правильно ли я Вас понял:

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

"wms_srs"            "EPSG:4301 EPSG:4269 EPSG:4326 EPSG:3857 "
?
К сожалению, вывести на экран мой шейп-файл так и не получается (((

Re: Shape file + Mapserver + OpenLayers

Добавлено: 10 май 2014, 21:27
Denis Rykov
Да, правильно. Не вижу у вас в коде OL где вы добавляете слой WMS на карту.

[ Сообщение с мобильного устройства ]

Re: Shape file + Mapserver + OpenLayers

Добавлено: 10 май 2014, 23:26
xen87
Не вижу у вас в коде OL где вы добавляете слой WMS на карту.
- да, действительно.
Если добавить так:

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

map.addLayer([layer, localWMS]);
- ничего не выводиться (белое окно).
Но если добавить так:

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

map.addLayer(localWMS);
map.addLayer(layer);
- выводиться слой ОСМ в нужной области (Токио), но слой с шейп-файлом не выводиться. Путаница с проекциями?

Re: Shape file + Mapserver + OpenLayers

Добавлено: 11 май 2014, 07:33
Denis Rykov
Для добавления списка слоёв используется метод addLayers, а не addLayer. А WMS-то у вас рабочий? Проверьте в какой-нибудь настольной ГИС (QGIS, например).

Re: Shape file + Mapserver + OpenLayers

Добавлено: 11 май 2014, 12:09
xen87
Для добавления списка слоёв используется метод addLayers, а не addLayer.
- спасибо, +1.
А WMS-то у вас рабочий? Проверьте в какой-нибудь настольной ГИС (QGIS, например).
- Попробовал подключиться к WMS с помощью КуГИС2.2 - http://gis-lab.info/qa/qgis-wms-wfs.html.

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

Название - Local WMS layers
Адрес - http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:/OSGeo4W/apps/mapserver-tutorial/example12/example_4326.map
Подключить - подключился, слой добавил, но во вьювере слой не отобразился ((( Пусто.

Также попытался подключиться к рабочему WMS-слою (данный слой взять из работающего примера и отображается в ГУгл Хроме), результат аналогичный - пустой вьювер (((
Приложу вариант "относительно рабочего" .map-файла, который в обозревателе отображается, а в КуГИС нет (((

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

MAP
  NAME        "mapserver_tutorial_wms_server"
  IMAGETYPE   PNG
  EXTENT      139.72520 35.67139 139.78845 35.70731       
  SIZE        550 450

  IMAGECOLOR  255 255 255
  SHAPEPATH   "../data"

  FONTSET     ../fonts/fonts.txt

  UNITS dd

  WEB	
    TEMPLATE  'example_template.html'
    IMAGEPATH "C:\OSGeo4W/tmp/ms_tmp/"
    IMAGEURL "/ms_tmp/"
    MINSCALEDENOM  1000
    MAXSCALEDENOM  70000
    METADATA
      "wms_title"          "MapServer Tutorial WMS Server"
      "wms_onlineresource" "http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:\OSGeo4W/apps/mapserver-tutorial/example12.map"
      "wms_srs"            "EPSG:4301 EPSG:4269 EPSG:4326 EPSG:3857"
      "wms_abstract"      "This demonstration server shows how to setup a MapServer .map file to serve data through the WMS standard."
    END    
  END
  
  PROJECTION
    "init=epsg:4301"
  END  

  LAYER 
    NAME "roads"
    METADATA
    "wms_title"    "Roads"
    END  
    DATA dourokukan
    STATUS ON
    TYPE LINE
    MAXSCALEDENOM 50000
    CLASS
      NAME "roads"
      STYLE
        COLOR 187 187 127
      END
    END
    PROJECTION
      "init=epsg:4301"
    END      
  END 

  LAYER 
    NAME "administrative"
    METADATA
    "wms_title"    "Administrative"
    END     
    DATA gyouseikai
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Administrative"
      STYLE
        COLOR 227 127 227
      END
    END
    PROJECTION
      "init=epsg:4301"
    END    
  END 

  LAYER 
    NAME "rail"
    METADATA
    "wms_title"    "Rail"
    END     
    DATA tetsudokukan
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Rail"
      STYLE
        COLOR 128 128 128
      END
    END
    PROJECTION
      "init=epsg:4301"
    END    
  END 

  LAYER 
    NAME "rivers"
    METADATA
    "wms_title"    "Rivers"
    END     
    DATA kasenkukan
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Rivers"
      STYLE
        COLOR 0 255 255
      END
    END
    PROJECTION
      "init=epsg:4301"
    END    
  END 

  LAYER 
    NAME "water"
    METADATA
    "wms_title"    "Water"
    END     
    DATA suiikikai
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Water"
      STYLE
        COLOR 0 0 255
      END
    END
    PROJECTION
      "init=epsg:4301"
    END    
  END 

  LAYER 
    NAME "places"
    METADATA
    "wms_title"    "Place name"
    END     
    DATA chimei 
    STATUS ON
    TYPE POINT
    LABELITEM "NAMAE"
    CLASS
      NAME "Places"
      STYLE
        COLOR 10 100 100
      END
      LABEL
        TYPE TRUETYPE
        FONT pgothic
        COLOR 220 20 20
        SIZE 7
        POSITION CL
        PARTIALS FALSE
        BUFFER 5
        ENCODING "SHIFT_JIS"                              
      END
    END
    PROJECTION
      "init=epsg:4301"
    END    
  END 

END 

Re: Shape file + Mapserver + OpenLayers

Добавлено: 12 май 2014, 08:48
Denis Rykov
Если у вас не отображается слой WMS в OpenLayers - откройте консоль и посмотрите какие запросы уходят к WMS серверу, скопируйте URL и откройте его руками в браузере - если все ок, то должна быть либо картинка, либо пустая картинка, в противном случае сообщение об ошибке (предложит сохранить как xml файл). Покажите здесь URL вашего WMS запроса.

Re: Shape file + Mapserver + OpenLayers

Добавлено: 12 май 2014, 10:31
xen87
Здравствуйте, Денис!
Я заметил такую вещь, если пишу так:
Случай 1.

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

map.addLayers([layer,localWMS]);
- то отображается только layer (слой ОСМ)
если пишу так:
Случай 2.

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

map.addLayer(localWMS);
- то отображается слой-ВМС.
Для второго случая запрос УРЛ:

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

http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:/OSGeo4W/apps/mapserver-tutorial/example12/example.map&LAYERS=mapserver_tutorial_wms_server&TRANSPARENT=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&FORMAT=image%2Fpng&SRS=EPSG%3A4326&BBOX=139.74609375,35.68359375,139.7900390625,35.7275390625&WIDTH=256&HEIGHT=256
По данному адресу выводиться картинка (тайл) с шейп-файлом.
А для случая 1, я так и не разобрался, даже не нашел УРЛ адрес ((( Просто отображается пустое белое окно (при включении вкладки - localWMS) (((

П.С. в начальный html-файл я добавил:

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

map.addControl( new OpenLayers.Control.LayerSwitcher() );
, чтоб переключаться между слоями.

Re: Shape file + Mapserver + OpenLayers

Добавлено: 12 май 2014, 10:36
Denis Rykov
Вот вам рабочий пример подключения WMS и OSM:

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

<html>
    <head>
        <title>My Map</title>
        <script src="http://openlayers.org/dev/OpenLayers.js"></script>
        <script>
            function init() {
                var options = {
                    div: "mapid",
                    projection: "EPSG:3857"
                };

                var map = new OpenLayers.Map(options);
                var osm = new OpenLayers.Layer.OSM()
                var imagery = new OpenLayers.Layer.WMS(
                    "Sattelite Image of St. Petersburg",
                    "http://10.22.0.9/cgi-bin/wms",
                    {layers: "sattelite_image", transparent: true},
                    {isBaseLayer: false, opacity: 0.9}
                );
                var extent = [3322236.017526,8366084.2704585,3418852.421265,8395053.9041745];
                map.addLayers([osm, imagery]);
                map.zoomToExtent(extent);
            }
        </script>
    </head>
    <body>
        <body onload="init()">
        <div id="mapid" style="width:100%; height:100%"></div>
    </body>
</html>

Re: Shape file + Mapserver + OpenLayers

Добавлено: 12 май 2014, 10:47
xen87
Вот вам рабочий пример подключения WMS и OSM:
- большое спасибо!
В качестве уточнения, в вашем примере слой из которого генерится WMS-слой, в какой EPSG?
Т.е. должен ли шейп-файл иметь ту же проекцию, что и слой OSM?
Спасибо.

Re: Shape file + Mapserver + OpenLayers

Добавлено: 12 май 2014, 10:56
Denis Rykov
Нет, данные могут быть в любой проекции, требуемая проекция указывается в параметрах WMS-запроса и если WMS сконфигурирован с поддержкой данной проекции, то он автоматом перепроецирует данные, вот почитайте.

Re: Shape file + Mapserver + OpenLayers

Добавлено: 12 май 2014, 14:26
xen87
Извините, но проблему пока не решил ((( Грешу на путаницу с проекциями (((
Правильно ли я понял, что в строке:

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

PROJECTION
    "init=epsg:4326"
  END
- указываем проекцию выходной карты (output PROJECTION)?
А в строке

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

LAYER 
    ...
    PROJECTION
      "init=epsg:4612"
    END      
...
  END 
- указываем проекцию исходных слоев (шейп-файлов)?

И как я понял, они могут не совпадать, как в этом примере - http://mapserver.org/tutorial/example1- ... ple1-6-map

И еще вопрос: в строке - указываем охват в единицах измерений что и в output PROJECTION? (т.е. в данном случае для epsg:4326).

Re: Shape file + Mapserver + OpenLayers

Добавлено: 13 май 2014, 09:16
xen87
Сегодня создал (переделал из примера) новый .map файл.

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

MAP
  NAME        "mapserver_tutorial_wms_server"
  IMAGETYPE   PNG
  EXTENT        139.562947 35.524705 139.917821 35.817635
  #EXTENT       15523653 4234704 15587812 4275175
  SIZE        550 450

  IMAGECOLOR  255 255 255
  SHAPEPATH   "../data"

  FONTSET     ../fonts/fonts.txt

  UNITS dd

  WEB	
    TEMPLATE  'example_template.html'
    IMAGEPATH "C:\OSGeo4W/tmp/ms_tmp/"
    IMAGEURL "/ms_tmp/"
    MINSCALEDENOM  1000
    MAXSCALEDENOM  70000
    METADATA
      "wms_title"          "MapServer Tutorial WMS Server"
      "wms_onlineresource" "http://127.0.0.1/cgi-bin/mapserv.exe?MAP=wms.map"
      "wms_srs"            "EPSG:4301 EPSG:4326 EPSG:3857"
      "wms_abstract"      "This demonstration server shows how to setup a MapServer .map file to serve data through the WMS standard."
    END    
  END
  
  PROJECTION
    "init=epsg:4612"
  END  

  LAYER 
    NAME "roads"
    METADATA
    "wms_title"    "Roads"
    END  
    DATA dourokukan
    STATUS ON
    TYPE LINE
    MAXSCALEDENOM 50000
    CLASS
      NAME "roads"
      STYLE
        COLOR 187 187 127
      END
    END
    PROJECTION
      "init=epsg:4612"
    END      
  END 

  LAYER 
    NAME "administrative"
    METADATA
    "wms_title"    "Administrative"
    END     
    DATA gyouseikai
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Administrative"
      STYLE
        COLOR 227 127 227
      END
    END
    PROJECTION
      "init=epsg:4612"
    END    
  END 

  LAYER 
    NAME "rail"
    METADATA
    "wms_title"    "Rail"
    END     
    DATA tetsudokukan
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Rail"
      STYLE
        COLOR 128 128 128
      END
    END
    PROJECTION
      "init=epsg:4612"
    END    
  END 

  LAYER 
    NAME "rivers"
    METADATA
    "wms_title"    "Rivers"
    END     
    DATA kasenkukan
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Rivers"
      STYLE
        COLOR 0 255 255
      END
    END
    PROJECTION
      "init=epsg:4612"
    END    
  END 

  LAYER 
    NAME "water"
    METADATA
    "wms_title"    "Water"
    END     
    DATA suiikikai
    STATUS ON
    TYPE LINE
    CLASS
      NAME "Water"
      STYLE
        COLOR 0 0 255
        SIZE 100
      END
    END
    PROJECTION
      "init=epsg:4612"
    END    
  END 

  LAYER 
    NAME "places"
    METADATA
    "wms_title"    "Place name"
    END     
    DATA chimei 
    STATUS ON
    TYPE POINT
    LABELITEM "NAMAE"
    CLASS
      NAME "Places"
      STYLE
        COLOR 10 100 100
      END
      LABEL
        TYPE TRUETYPE
        FONT pgothic
        COLOR 220 20 20
        SIZE 100
        POSITION CL
        PARTIALS FALSE
        BUFFER 100
        ENCODING "SHIFT_JIS"                              
      END
    END
    PROJECTION
      "init=epsg:4612"
    END    
  END 

END 
В ручную построил к нему запросы

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

http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:\OSGeo4W/apps/mapserver-tutorial/example12/example.map&SERVICE=wms&VERSION=1.1.1&REQUEST=GetMap&LAYERS=mapserver_tutorial_wms_server&SRS=EPSG:4301&BBOX=139.72520,35.67139,139.78845,35.70731&FORMAT=image/png&WIDTH=550&HEIGHT=450
- работает, выводиться картинка

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

http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:\OSGeo4W/apps/mapserver-tutorial/example12/example.map&SERVICE=wms&VERSION=1.1.1&REQUEST=GetMap&LAYERS=mapserver_tutorial_wms_server&SRS=EPSG:4326&BBOX=139.72520,35.67139,139.78845,35.70731&FORMAT=image/png&WIDTH=550&HEIGHT=450
- работает, выводиться картинка

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

http://127.0.0.1/cgi-bin/mapserv.exe?MAP=C:\OSGeo4W/apps/mapserver-tutorial/example12/example.map&SERVICE=wms&VERSION=1.1.1&REQUEST=GetMap&LAYERS=mapserver_tutorial_wms_server&SRS=EPSG:3857&BBOX=15523653,%204234704,%2015587812,%204275175&FORMAT=image/png&WIDTH=550&HEIGHT=450
- работает, выводиться картинка (в новой проекции с новым охватом)

А в лога аппача выводиться вот что:

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

"GET /cgi-bin/mapserv.exe?MAP=C:/OSGeo4W/apps/mapserver-tutorial/example12/example.map&LAYERS=mapserver_tutorial_wms_server&TRANSPARENT=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&FORMAT=image%2Fpng&SRS=EPSG%3A3857&BBOX=-0.3515625,-0.17578125,-0.17578125,0&WIDTH=256&HEIGHT=256 HTTP/1.1" 200 164
- т.е. "левые" координаты охвата. Как их можно победить, чтоб формировался правильный запрос? Подскажите пожалуйста.

Re: Shape file + Mapserver + OpenLayers

Добавлено: 14 май 2014, 22:25
Denis Rykov
Этот последний запрос отправляет OpenLayers?