Mapserver WMS МСК в Leaflet

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

Mapserver WMS МСК в Leaflet

Сообщение fynjy888 » 29 апр 2016, 17:55

Доброго времени суток. Есть mapserver настроенный на WMS, в нём 2 слоя: растр + wld и shp. Всё это в координатах условной местной план схемы, то есть это плоская местная городская система координат, которая по сути не имеет никакого отношения к широте и долготе.

Изображение

Собственно вопрос как WMS с такими координатами вывести в Leaflet?
QGIS выводил карту адекватно при EPSG:4326 и

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

 "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
в .map файле. С Leaflet такое не сработало. Попытка изменить EPSG на 3857 дала черные квадраты
Спойлер
Изображение
Вопрос: Как вывести WMS в координатах с картинки в Leaflet?

Почитав "разное", пришел к выводу что нужно создать новую EPSG:99999 проекцию как в mapserver:
Добавить в /usr/local/share/proj/epsg

#MSK for N town
<99999> +proj=merc +x_0=-11.7050 +y_0=1968.2715 .. наверное что-то еще (в proj.4 мало что понимаю, как и в проекциях, как вы уже наверное поняли)

так и в Leaflet при помощи Proj4Leaflet:

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

var crs = new L.Proj.CRS('+proj=merc +x_0=-11.7050 +y_0=1968.2715',
  {
    resolutions: [8192, 4096, 2048], // 3 example zoom level resolutions
  }
);
P.S. Сильно не бейте, если пишу совсем идиотские вещи :roll: Торжественно клянусь задонатить форуму

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

Re: Mapserver WMS МСК в Leaflet

Сообщение Denis Rykov » 29 апр 2016, 18:25

Spatial is now, more than ever, just another column- The Geometry Column.

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

Re: Mapserver WMS МСК в Leaflet

Сообщение fynjy888 » 29 апр 2016, 19:22

Это я читал, L.CRS.Simple по идее в документации да, служит как раз для плоских координат, но карту по прежнему не показывает. Плагин leaflet.wms выдаёт такую ошибку: WMS server error. Unsupported SRS namespace (only EPSG and AUTO currently supported).

Соответственно есть подозрения, что выход из ситуации EPSG

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

Re: Mapserver WMS МСК в Leaflet

Сообщение Denis Rykov » 29 апр 2016, 19:49

Не понимаю зачем вообще вам понадобился WMS? Разрежьте картинку на тайлы и подключите в Leaflet как описано в статье.
Spatial is now, more than ever, just another column- The Geometry Column.

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

Re: Mapserver WMS МСК в Leaflet

Сообщение fynjy888 » 29 апр 2016, 20:00

Denis Rykov писал(а):Не понимаю зачем вообще вам понадобился WMS? Разрежьте картинку на тайлы и подключите в Leaflet как описано в статье.
WMS понадобился в первую очередь для условных знаков, к тому же shp слоёв планируется очень много и растров тоже. В общем mapserver тут был идеальный вариант, кроме того, что WMS не хочет в Leaflet отображаться.

Разрезанную картинку на тайлы я подключал и L.CRS.Simple + L.Transformation работало как надо. В чем принципиальное отличие тайлов от WMS и почему L.CRS.Simple выдаёт ошибку понять не могу. Как я понимаю нужно создать свой EPSG с плоской местной системой координат. Но как это реализовать в Proj.4 не знаю

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2232
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1506
Откуда: Казань

Re: Mapserver WMS МСК в Leaflet

Сообщение Игорь Белов » 29 апр 2016, 20:15

fynjy888 писал(а):Как я понимаю нужно создать свой EPSG с плоской местной системой координат. Но как это реализовать в Proj.4 не знаю
Если не планируете использовать внешние данные в проекциях, отличных от городской, просто укажите EPSG:3857 или EPSG:3395 в качестве CRS.
The purpose of computing is insight, not numbers

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

Re: Mapserver WMS МСК в Leaflet

Сообщение fynjy888 » 29 апр 2016, 20:36

ErnieBoyd писал(а):
fynjy888 писал(а):Как я понимаю нужно создать свой EPSG с плоской местной системой координат. Но как это реализовать в Proj.4 не знаю
Если не планируете использовать внешние данные в проекциях, отличных от городской, просто укажите EPSG:3857 или EPSG:3395 в качестве CRS.
Указывал L.CRS.EPSG3395 в Leaflet, указывал EPSG:3395 в *.map - не помогло, в разных вариациях выдаёт либо черные квадраты внизу, либо пустые тайлы внизу :|

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

Re: Mapserver WMS МСК в Leaflet

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

Единственное что нашел по поводу REQUEST=GetMap запросов - это:

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

o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1}
Не уверен, что это то, что нужно, но тут crs:null. :o


Ошибку в getfeatureinfo выводит такую: Requested layer(s) are not queryable

Любые идеи в какую сторону вообще копать, пожалуйста. Любые изменения map файла приводят к ошибке в QGIS "Не удалось рассчитать границы, недействительный WMS слой" :(

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

Re: Mapserver WMS МСК в Leaflet

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

Еще раз суть проблемы:
Спойлер

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

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
    TEMPLATE  "./templates/template.html"
    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/plain"
ows_enable_request "*"	
END
  END

  PROJECTION
"init=epsg:3576"
  END

  LAYER # States polygon layer begins here
    NAME         veget
    DATA         vodoprovod
    STATUS       ON
    TYPE         LINE

    CLASSITEM    "TIP"
    PROJECTION
"init=epsg:3576"
    END
    CLASS
      NAME       "Наземный"
      EXPRESSION 'водопровод наземный' # Выражение, определяющее класс
      STYLE
        COLOR        12 20 120
      END
    END
    CLASS
      NAME       "Подземный"
      EXPRESSION 'водопровод подземный'
      STYLE
        COLOR        200 255 12
      END
    END
	METADATA
		wms_title         "Countries 1"
		wms_abstract      "Countries 1 test"
		wms_srs           "EPSG:3576"
		wms_include_items "all"
	END
  END

  LAYER
     NAME "mappers"  # название слоя
  DATA "nngasu.tif"    # имя файла с расширением (пути прописываются относительно SHAPEPATH)
  TYPE RASTER
  STATUS ON
	METADATA
		wms_title    "Countries 2"
		wms_abstract "Countries 2 test"
		wms_srs      "EPSG:3576"
	END
  END

END
Кратко: ставлю везде проекцию EPSG:3576, в PROJECTION ставлю init=epsg:3576

В QGIS всё отлично подключается и открывает

Запрос типа

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

 http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=mappers&STYLES=&SRS=EPSG:3576&BBOX=-11.7050,1468.9700,363.7713,1968.2715&WIDTH=400&HEIGHT=300&FORMAT=image/png
Выдаёт ошибку:
Спойлер

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

<?xml version='1.0' encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ServiceExceptionReport SYSTEM "http://schemas.opengis.net/wms/1.1.1/exception_1_1_1.dtd">
<ServiceExceptionReport version="1.1.1">
<ServiceException code="InvalidSRS">
msWMSLoadGetMapParams(): WMS server error. Invalid SRS given : SRS must be valid for all requested layers.
</ServiceException>
</ServiceExceptionReport>
В Leaflet такой код:
Спойлер

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

var crs = new L.Proj.CRS('EPSG:3576',
	'+proj=laea +lat_0=90 +lon_0=90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs',
	{
		resolutions: [
			8192, 4096, 2048, 1024, 512, 256, 128,
			64, 32, 16, 8, 4, 2, 1, 0.5
		],
		origin: [0, 0]
	});

var map = L.map('map', {
crs: crs,
minZoom: 0,
maxZoom: 14,
		continuousWorld: true,
		worldCopyJump: false
}).setView([1668.9700,150.7050], 3); 
//map.setMaxBounds(new L.LatLngBounds([1468.9700,-11.7050], [1968.2705,363.7705]));
       
var source = L.WMS.source("http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&", {
    'transparent': true,
   'tiled': true,
   });
source.getLayer("veget").addTo(map);
source.getLayer("mappers").addTo(map);
Вопрос: что я делаю не так?
Любые идеи в какую сторону вообще копать, пожалуйста.

P.S. А сообщения удалять нельзя? А то я тут кучу всякого понаписал :oops:

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: Mapserver WMS МСК в Leaflet

Сообщение ericsson » 08 май 2016, 23:21

А что вам выдает такой запрос:

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

http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities
?
Проверка capabilities должна быть первым шагом после того, как вы не получили искомое в ответе.
Второй шаг (если какой-то криминал не обнаружится в ответе на GetCapabilities) в вашем случае - взять любой монитор трафика и посмотреть на HTTP-запрос, который отправляет QGIS и сравнить с тем, который вы отправляете вручную.

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

Re: Mapserver WMS МСК в Leaflet

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

Спойлер

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

<?xml version='1.0' encoding="UTF-8" standalone="no" ?>
<!DOCTYPE WMT_MS_Capabilities SYSTEM "http://schemas.opengis.net/wms/1.1.1/WMS_MS_Capabilities.dtd"
 [
 <!ELEMENT VendorSpecificCapabilities EMPTY>
 ]>  <!-- end of DOCTYPE declaration -->

<WMT_MS_Capabilities version="1.1.1">

<!-- MapServer version 7.0.1 (MS4W 3.1.3) OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE -->

<Service>
  <Name>OGC:WMS</Name>
  <Title>GIS-LAB Demo</Title>
  <Abstract>This is the WMS demo from GIS-Lab</Abstract>
  <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/>
  <ContactInformation>
  </ContactInformation>
</Service>

<Capability>
  <Request>
    <GetCapabilities>
      <Format>application/vnd.ogc.wms_xml</Format>
      <DCPType>
        <HTTP>
          <Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Get>
          <Post><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Post>
        </HTTP>
      </DCPType>
    </GetCapabilities>
    <GetMap>
      <Format>image/png</Format>
      <Format>image/jpeg</Format>
      <Format>image/png; mode=8bit</Format>
      <Format>application/x-pdf</Format>
      <Format>image/svg+xml</Format>
      <Format>image/tiff</Format>
      <Format>application/vnd.google-earth.kml+xml</Format>
      <Format>application/vnd.google-earth.kmz</Format>
      <DCPType>
        <HTTP>
          <Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Get>
          <Post><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Post>
        </HTTP>
      </DCPType>
    </GetMap>
    <GetFeatureInfo>
      <Format>text/plain</Format>
      <Format>application/vnd.ogc.gml</Format>
      <DCPType>
        <HTTP>
          <Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Get>
          <Post><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Post>
        </HTTP>
      </DCPType>
    </GetFeatureInfo>
    <DescribeLayer>
      <Format>text/xml</Format>
      <DCPType>
        <HTTP>
          <Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Get>
          <Post><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Post>
        </HTTP>
      </DCPType>
    </DescribeLayer>
    <GetLegendGraphic>
      <Format>image/png</Format>
      <Format>image/jpeg</Format>
      <Format>image/png; mode=8bit</Format>
      <DCPType>
        <HTTP>
          <Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Get>
          <Post><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Post>
        </HTTP>
      </DCPType>
    </GetLegendGraphic>
    <GetStyles>
      <Format>text/xml</Format>
      <DCPType>
        <HTTP>
          <Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Get>
          <Post><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&"/></Post>
        </HTTP>
      </DCPType>
    </GetStyles>
  </Request>
  <Exception>
    <Format>application/vnd.ogc.se_xml</Format>
    <Format>application/vnd.ogc.se_inimage</Format>
    <Format>application/vnd.ogc.se_blank</Format>
  </Exception>
  <VendorSpecificCapabilities />
  <UserDefinedSymbolization SupportSLD="1" UserLayer="0" UserStyle="1" RemoteWFS="0"/>
  <Layer>
    <Name>WMS</Name>
    <Title>GIS-LAB Demo</Title>
    <Abstract>This is the WMS demo from GIS-Lab</Abstract>
    <SRS>EPSG:3576</SRS>
    <LatLonBoundingBox minx="-103.909" miny="89.9821" maxx="-89.5435" maxy="89.9868" />
    <BoundingBox SRS="EPSG:3576"
                minx="-11.705" miny="1468.97" maxx="363.771" maxy="1968.27" />
    <Layer queryable="0" opaque="0" cascaded="0">
        <Name>veget</Name>
        <Title>Countries 1</Title>
        <Abstract>Countries 1 test</Abstract>
        <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" />
        <Style>
          <Name>default</Name>
          <Title>default</Title>
          <LegendURL width="84" height="43">
             <Format>image/png</Format>
             <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/polt.map&version=1.1.1&service=WMS&request=GetLegendGraphic&layer=veget&format=image/png&STYLE=default"/>
          </LegendURL>
        </Style>
    </Layer>
    <Layer queryable="0" opaque="0" cascaded="0">
        <Name>mappers</Name>
        <Title>Countries 2</Title>
        <Abstract>Countries 2 test</Abstract>
        <SRS>EPSG:3576</SRS>
        <LatLonBoundingBox minx="-103.907" miny="89.9821" maxx="-89.5422" maxy="89.9868" />
        <BoundingBox SRS="EPSG:3576"
                    minx="-11.7368" miny="1469" maxx="363.739" maxy="1968.3" />
    </Layer>
  </Layer>
</Capability>
</WMT_MS_Capabilities>
Криминала вроде нет :lol:

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: Mapserver WMS МСК в Leaflet

Сообщение ericsson » 09 май 2016, 04:31

Ну, для слоя mappers - вроде нет.
Хотя вот значения X для veget - какие-то адские.

trir
Гуру
Сообщения: 5298
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Mapserver WMS МСК в Leaflet

Сообщение trir » 09 май 2016, 12:27

плоская местная городская система координат, которая по сути не имеет никакого отношения к широте и долготе.
не верно

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: Mapserver WMS МСК в Leaflet

Сообщение ericsson » 09 май 2016, 17:36

Из общих соображений (поправьте, кто лучше знаком с поведением Mapserver), если используется "подстановочная" плоская система координат, область значений координат наборов данных не должна выходить за пределы, определенные для этой СК и для географической СК. В противном случае поведение софта непредсказуемо (предсказуемо только при внимательном изучении исходников или есть это уже выяснено эмпирически).

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

Re: Mapserver WMS МСК в Leaflet

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

Так в том и дело, что явно границы моего куска карты (-11.7050, 1468.97 - 363.7713, 1968.2715) - не выходят за пределы EPSG:3576 и уж тем более EPSG:3395. Однако есть подозрения, что в Leaflet по-прежнему, несмотря на мои изменения проекций, ограничение -180 180 по Х :(

Ответить

Вернуться в «Координаты и привязка»

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

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