GetFeatureInfo и OpenLayers3

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
fynjy888
Интересующийся
Сообщения: 35
Зарегистрирован: 06 июл 2015, 23:01
Репутация: 2

GetFeatureInfo и OpenLayers3

Сообщение fynjy888 » 18 май 2016, 22:08

Приветствую! С большими трудами настроил mapserver на wms, подключил туда слой PostGIS и растр, вывел это всё в OpenLayers3, но не могу вывести атрибутивные данные, так как везде устаревшие примеры с контролами и OL2.

Пример на OL3 (http://openlayers.org/en/latest/example ... -tile.html) конечно же видел, его и пытаюсь использовать.

Итак, что делаю:

В PostGIS при помощи ogr2ogr поместил .shp, поменял проекцию на EPSG:3576 в отдельную колонку webmercator. При подключении PostGIS в QGIS всё работает и данные отображаются
Спойлер
Изображение
С кодировкой проблемы, но сейчас не об этом


Далее в .map файле в WEB прописываю такие METADATA:

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

	METADATA
		wms_title                  "GIS-LAB Demo"
		wms_abstract               "This is the WMS demo from GIS-Lab"
		wms_onlineresource         "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"
		wms_srs                    "EPSG:3576"
		wms_getfeatureinfo         "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"
		wms_featureinfoformat      "text/html"
		wms_encoding               "utf-8"
		ows_enable_request "*"	
		wms_feature_info_mime_type "text/html"
		END
wms_feature_info_mime_type "text/html" - в статьях пишут, что это самое главное, тоже самое прописываю и в LAYER (который PostGIS)

Слой в QGIS отображается, как там получить ответ на GetFeatureInfo - не знаю, поэтому проверить атрибутивные данные на настольном ГИС не могу.

В OpenLayers3 вставляю код из примера, заменив EPSG на 3576 и document.getElementById('info') - тут я так понял нужно вставить первичный ключ из PostGIS (у меня это ogc_fid):
Спойлер

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

map.on('singleclick', function(evt) {
        document.getElementById('ogc_fid').innerHTML = '';
        var viewResolution = /** @type {number} */ (view.getResolution());
        var url = wmsSource.getGetFeatureInfoUrl(
            evt.coordinate, viewResolution, 'EPSG:3576',
            {'INFO_FORMAT': 'text/html'});
        if (url) {
          document.getElementById('ogc_fid').innerHTML =
              '<iframe seamless src="' + url + '"></iframe>';
        }
      });

      map.on('pointermove', function(evt) {
        if (evt.dragging) {
          return;
        }
        var pixel = map.getEventPixel(evt.originalEvent);
        var hit = map.forEachLayerAtPixel(pixel, function() {
          return true;
        });
        map.getTargetElement().style.cursor = hit ? 'pointer' : '';
      });
В итоге при клике document.getElementById(...) is null :roll:

Запрос (не уверен, что правильно составил его)
Спойлер

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

http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&FORMAT=image/png&TRANSPARENT=true&QUERY_LAYERS=veget&LAYERS=veget&INFO_FORMAT=text/plain&I=36&J=69&WIDTH=256&HEIGHT=256&CRS=EPSG:3576&STYLES=&BBOX=-11.7050,1468.9700,363.7713,1968.2715
выдаёт
GetFeatureInfo results:

Search returned no results.


Вопрос: как вывести атрибутивные данные данного отрезка при щелчке по слою?

P.S. Маленькое спасибо этому форуму
Спойлер
Изображение

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: GetFeatureInfo и OpenLayers3

Сообщение Denis Rykov » 19 май 2016, 04:59

В QGIS GetFeatureInfo (GFI) можно выполнить обычным инструментом идентификации. А вы шаблон для GFI написали? Вот эту статью прочитайте.
fynjy888 писал(а):В OpenLayers3 вставляю код из примера, заменив EPSG на 3576 и document.getElementById('info') - тут я так понял нужно вставить первичный ключ из PostGIS (у меня это ogc_fid)
Причём здесь первичный ключ? Это id блока вашей html страницы, в котором вы будете отображать результат идентификации.
Spatial is now, more than ever, just another column- The Geometry Column.

fynjy888
Интересующийся
Сообщения: 35
Зарегистрирован: 06 июл 2015, 23:01
Репутация: 2

Re: GetFeatureInfo и OpenLayers3

Сообщение fynjy888 » 19 май 2016, 12:12

Denis Rykov писал(а):В QGIS GetFeatureInfo (GFI) можно выполнить обычным инструментом идентификации.
Спойлер
Изображение
Да, всё сработало

Denis Rykov писал(а):А вы шаблон для GFI написали? Вот эту статью прочитайте.
Да, статью читал, по аналогии вроде сделал эти файлы.
Denis Rykov писал(а):Это id блока вашей html страницы, в котором вы будете отображать результат идентификации.
Заменил на инфо, div вставил. Ошибка перешла на следующую строку

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

ReferenceError: view is not defined
var viewResolution = /** @type {number} */ (view.getResolution());

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: GetFeatureInfo и OpenLayers3

Сообщение Denis Rykov » 19 май 2016, 19:41

И что непонятного в этом сообщении об ошибке?
Spatial is now, more than ever, just another column- The Geometry Column.

fynjy888
Интересующийся
Сообщения: 35
Зарегистрирован: 06 июл 2015, 23:01
Репутация: 2

Re: GetFeatureInfo и OpenLayers3

Сообщение fynjy888 » 19 май 2016, 21:31

Ничего не понятно, почему функция view не определена? Я так это понимаю

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

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: GetFeatureInfo и OpenLayers3

Сообщение Denis Rykov » 20 май 2016, 00:18

Почему функция, переменная ваша view не определена.
Spatial is now, more than ever, just another column- The Geometry Column.

fynjy888
Интересующийся
Сообщения: 35
Зарегистрирован: 06 июл 2015, 23:01
Репутация: 2

Re: GetFeatureInfo и OpenLayers3

Сообщение fynjy888 » 20 май 2016, 01:12

Это какое-то издевательство :D

TypeError: a is undefined

ol.js (строка 17, столбец 364)

:roll: видимо опять проекции, что-то вышло за границы переменной.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: GetFeatureInfo и OpenLayers3

Сообщение Denis Rykov » 20 май 2016, 03:58

При отладке используйте файл ol-debug.js, чтобы сообщения об ошибках были более информативными.
Spatial is now, more than ever, just another column- The Geometry Column.

fynjy888
Интересующийся
Сообщения: 35
Зарегистрирован: 06 июл 2015, 23:01
Репутация: 2

Re: GetFeatureInfo и OpenLayers3

Сообщение fynjy888 » 20 май 2016, 13:05

TypeError: obj is undefined

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

goog.getUid = function(obj) {
  // TODO(arv): Make the type stricter, do not accept null.

  // In Opera window.hasOwnProperty exists but always returns false so we avoid
  // using it. As a consequence the unique ID generated for BaseClass.prototype
  // and SubClass.prototype will be the same.
  return obj[goog.UID_PROPERTY_] ||
      (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);
};
Возвращает uid такой, что obj не определён?

P.S. Извиняюсь, что это превращается уже в какое-то обучение и разъяснение по каждой появляющейся проблеме

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: GetFeatureInfo и OpenLayers3

Сообщение Denis Rykov » 23 май 2016, 12:22

Сложно судить о том, что происходит, не видя картины в целом. Сделайте какой-нибудь jsfiddle, или просто покажите свой код.
Spatial is now, more than ever, just another column- The Geometry Column.

fynjy888
Интересующийся
Сообщения: 35
Зарегистрирован: 06 июл 2015, 23:01
Репутация: 2

Re: GetFeatureInfo и OpenLayers3

Сообщение fynjy888 » 23 май 2016, 15:22

OL3:
https://jsfiddle.net/qr69nq81/

(там ссылки на localhost и т.д., проверить работоспособность нельзя, но читать удобнее)


.map файл:
Спойлер

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

MAP
  NAME           "WMS"
  STATUS         ON
  IMAGETYPE      PNG
  SIZE           400 300
  EXTENT         -11.7050 1468.9700 363.7713 1968.2715
  UNITS METERS
  SHAPEPATH      "/ms4w/apps/example/shp/"
  IMAGECOLOR     255 255 255

  WEB
    IMAGEPATH "/ms4w/tmp/ms_tmp/"
    IMAGEURL  "/ms_tmp/"
	METADATA
		wms_title                  "GIS-LAB Demo"
		wms_abstract               "This is the WMS demo from GIS-Lab"
		wms_onlineresource         "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"
		wms_srs                    "EPSG:3576"
		wms_getfeatureinfo         "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"
		wms_featureinfoformat      "text/html"
		wms_encoding               "utf-8"
		ows_enable_request "*"	
		wms_feature_info_mime_type "text/html"
		END
  END

  PROJECTION
"init=epsg:3576"
  END
  
  
  

LAYER
    NAME "veget"
	METADATA
    "wms_title"                "Vod"
    "wms_include_items"        "all"
    "wms_enable_request"       "*"
    wms_encoding               "utf-8"
	wms_feature_info_mime_type "text/html"
	END
    TYPE LINE
      HEADER   header.html
      TEMPLATE template.html
      FOOTER   footer.html
	STATUS ON
	CONNECTIONTYPE       postgis
    CONNECTION          "host=127.0.0.1 port=5432 dbname=postgis user=postgres password=gzcqki9s"
    DATA                "webmercator from vo using unique webmercator using srid=3576"
    PROJECTION
    "init=epsg:3576"
    END
   CLASS
      COLOR 200 120 123
   END
END 
  
  
  LAYER
     NAME "mappers"  # название слоя
  DATA "mappers.bmp"    # имя файла с расширением (пути прописываются относительно SHAPEPATH)
  TYPE RASTER
      HEADER   header.html
      TEMPLATE template.html
      FOOTER   footer.html
  STATUS ON
	METADATA
		wms_title    "Countries 2"
		wms_abstract "Countries 2 test"
		wms_srs      "EPSG:3576"
		wms_include_items "all"
		wms_encoding               "utf-8"
	END
  END

END
TEMPLATES на всякий случай:
Спойлер

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

<!-- MapServer Template -->
    </tbody>
  </table>
 </body>
</html>
Спойлер

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

<!-- MapServer Template -->
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css" /> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
<title>GetFeatureInfo Response</title>
</head>
<body>
   <table>
      <caption>Имя слоя: soils</caption>
         <tbody>
            <th>ID</th>
            <th>TIP</th>
            <th>DLINA</th>
            <th>OGC_FID</th>
Спойлер

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

<!-- MapServer Template -->
<tr>
     <td>[item name=ID format=$value escape=none]</td>
     <td>[item name=TIP format=$value escape=none]</td>
     <td>[item name=DLINA format=$value escape=none]</td>
     <td>[item name=OGC_FID format=$value escape=none]</td>
</tr>

fynjy888
Интересующийся
Сообщения: 35
Зарегистрирован: 06 июл 2015, 23:01
Репутация: 2

Re: GetFeatureInfo и OpenLayers3

Сообщение fynjy888 » 01 июн 2016, 22:27

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

    <Layer queryable="1" opaque="0" cascaded="0">
        <Name>veget</Name>
        <Title>Vod</Title>
        <SRS>EPSG:3576</SRS>
        <LatLonBoundingBox minx="260.799" miny="89.9831" maxx="268.862" maxy="89.9864" />
        <BoundingBox SRS="EPSG:3576"
                    minx="37.2273" miny="1515.79" maxx="245.538" maxy="1874.86" />
    </Layer>
Из каких-то не состыковок и ошибок нашел только странные значения X, однако в перепроецированных координатах всё в порядке. Вряд ли в них конечно дело

Любые идеи, что это может быть, вроде делаю всё по инструкциям и статьям с gis-lab. Заранее спасибо

Ответить

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

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

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