Страница 1 из 2
mapserver5.0- неправильная картинки при другом projection
Добавлено: 14 мар 2014, 19:06
dmitrijk
B мап-файле данные представлены в epsg:4326. клиент (браузер) отображает в epsg:900913.
В запросе тайла клиент шлет координаты квадрата, который клиент считает именно квадратом (на экране он так и отображается). но для меркатора, используемого в мап-файле это совсем не квадрат - пиксельное расстояние между широтами не совпадает. поэтому MapServer пытается растянуть данные по предполагаемому холсту (скажем 256х256).
Проблема в том, что он делает это по своим хитрым правилам: растягивает в обоих измерениях и смещает центр, в итоге картинке на выходе рисуется со смещением и неправильным размером
Я не смог заставить мапсервер вписать "ящик с этими координатами" в "этот пиксельный размер".
Вот запрос (координаты уже переделаны в epsg:4326, но угловые размеры от epsg:900913):
Код: Выделить всё
<server>/mapserv.exe?map=example.map&mapsize=256%20256&mode=map&layers=all&mapext=87.89%2069.349%2088.066%2069.411
Кусок map-файла:
Код: Выделить всё
...
MAP
IMAGETYPE PNG
EXTENT 88.008001 69.336491 88.373237 69.500044
SIZE 512 512
IMAGECOLOR 255 2 250
LAYER
CONNECTION "../R45093v_LAYER24.TAB"
NAME l1
TYPE POLYGON
CONNECTIONTYPE OGR
STATUS OFF
STYLEITEM "AUTO"
CLASS
END
END
.....
Есть идеи?
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 14 мар 2014, 20:08
Denis Rykov
MapServer ничего никуда не растягивает. Судя по тем данным, что вы привели клиент запрашивает данные в 4326, их и получает, 900913 здесь вообще откуда взялось? И это, режим map - это старье, используете WMS.
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 08:36
dmitrijk
клиент работает с 900913 (он же - 3857), 4326 запрашивается уже после трансформации квадрата из 900913 (трансформация производится на клиенте перед запросом). представлю наглядно:

- работа_maperver.png (151.48 КБ) 13105 просмотров
не открою Америку - очевидно что в 900913 имеет место нелинейная зависимость в пиксельном расстоянии между широтами. именно в таком виде и представлено на клиенте.
теперь к примеру браузер пытается получить картинку тайла с островом Северный в Баренцевом море (верхний рисунок). он запрашивает у сервера сектор между широтами 60-80 и долготами 50-80 (в 4326) и требует отобразить это в картинке размером 256х256.
сервер же видит что в 4326 это не квадрат (следующий рисунок). и отрисовывает как на нижнем рисунке.
возможно термин "растягивает" не уместен для мапсервера, но факт есть факт - картинка растянута в обоих измерениях и к тому же сдвинута. по логике картинка должна быть растянута только по вертикали и никуда не сдвигаться.
вопрос - как этого добиться
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 08:45
Denis Rykov
Смотрите, если вы работаете с растром, то должны запрашивать тайл в той проекции, в которой работаете. Если на клиенте вы используете 900913, то и изображение сервер должен отдавать в этой проекции. Обычно, и bbox передают в той же проекции, что и сами данные. То есть вам необходимо на стороне сервера активировать поддержку гугломеркатора и запрашивать данные в нём. Зачем вы просите у сервера данные в 4326, если вам нужен меркатор для отображения?
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 09:26
dmitrijk
пока что ищу быстрый способ скрещивания ужа с ежом. просто есть векторные карты, поставляемые в 4236. они подключаются в мап-файл как было показано выше. заставить сервер отдавать в 900913 не получается. если знаете как - буду признателен за совет.
PS. конвертации карт в 900913 хотелось бы избежать
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 09:54
Denis Rykov
Естественно, исходные данные трогать не нужно. Не знаю как с режимом map (еще раз советую вам отказаться от его использования и перейти на WMS), но в случае если MapServer используется как WMS сервер, то в map-файле на уровне объекта MAP указываете проекцию исходных данных, а в wms_srs - проекции, которые вам требуются от MapServer на выходе:
Код: Выделить всё
MAP
....
PROJECTION
"init=epsg:4326"
END
WEB
...
METADATA
"wms_title" "WMS Demo Server"
"wms_onlineresource" "http://my.host.com/cgi-bin/mapserv?map=wms.map&"
"wms_srs" "EPSG:3857"
END
END
Если для блока LAYER не указана проекция, то она наследуется от блока MAP (если у вас все слои в 4326, то это как раз ваш случай). Далее при обращении по WMS в URL передается необходимый bbox, идентификатор системы координат, размер выходного изображения и прочие необходимые параметры, определяемые стандартом WMS. В 99% случаев эти запросы генерирует WMS-клиент (если вы работаете в браузере, то и OpenLayers и Leaflet поддерживают WMS), но вы можете формировать их и руками, если потребуется. Документация по настройке WMS-сервера
тут. Вот еще
статья, правда она устарела.
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 13:47
dmitrijk
убрал mode=map, привел запрос к такому виду^
<server>?map=example3.map&LAYERS=all&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=
&FORMAT=image%2Fjpeg&SRS=EPSG%3A900913&WIDTH=256&HEIGHT=256
&BBOX=9823075.3776172,10860172.977246,9842643.2568555,10879740.856484
выдается XML с текстом:
msWMSLoadGetMapParams(): WMS server error. Invalid layer(s) given in the LAYERS parameter.
ошибка исчезает при возвращении в запрос параметра mode=map
поиск решения не дал
PS. example.map :
MAP
NAME "wms"
IMAGETYPE PNG
EXTENT -90 -180 90 180
SIZE 256 256
IMAGECOLOR 255 2 250
PROJECTION
"init=epsg:4236"
END
WEB
METADATA
"wms_enable_request" "*"
"wms_exceptions_format" "application/vnd.ogc.se_xml"
"wms_title" "l1"
"wms_onlineresource" "
http://localhost:90/cgi-bin/mapserv.exe ... ample3.map&"
"wms_srs" "EPSG:900913"
wms_getfeatureinfo "
http://localhost:90/cgi-bin/mapserv.exe ... ample3.map&"
wms_featureinfoformat "text/plain"
wms_include_items "all"
END
END
LAYER
CONNECTION "../R45093v_LAYER24.TAB"
NAME l1
TYPE POLYGON
CONNECTIONTYPE OGR
STATUS OFF
STYLEITEM "AUTO"
CLASS
END
END
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 15:22
Denis Rykov
Нет такого слоя all, укажите явно имена слоев через запятую, например, LAYERS=l1.
[ Сообщение с мобильного устройства ]
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 15:24
Denis Rykov
Еще, лучше не использовать код 900913, а вместо него использовать 3857, так как зачастую многие прлграммы не понимают его, с 3857 такой проблемы не встречал.
[ Сообщение с мобильного устройства ]
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 15:26
Denis Rykov
И не 4236, а 4326.
[ Сообщение с мобильного устройства ]
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 15:29
dmitrijk
не помогает ни то ни другое. пробовал также по некоторым рекомендация указывать номер слоя (layers=0)
в одном из постов было предположение, что mapserver на самом деле шлет формализованное сообщение об ошибке, и дело может быть совсем не в слоях
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 15:46
Denis Rykov
Где вы такого начитались. Никаких номеров слоев MapServer не использует. Поменяйте имя слоя на что нибудь внятное, сейчас l1 еще где-то в map-файле используется и покажите тут URL запроса полностью и текст ошибки, если она будет.
[ Сообщение с мобильного устройства ]
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 15:51
dmitrijk
localhost/cgi-bin/mapserv_dev.exe?map=../apps/altay/htdocs/example3.map&LAYERS=layer1&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image/png&SRS=EPSG:3857&BBOX=9823075.3776172,10860172.977246,9842643.2568555,10879740.856484&WIDTH=256&HEIGHT=256
layer=layer1 (внутри map-файла он так же обозван layer1)
возвращается :
<ServiceExceptionReport xmlns="
http://www.opengis.net/ogc" xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" version="1.3.0" xsi:schemaLocation="
http://www.opengis.net/ogc http://schemas.opengis.net/wms/1.3.0/ex ... _1_3_0.xsd">
<ServiceException code="LayerNotDefined">
msWMSLoadGetMapParams(): WMS server error. Invalid layer(s) given in the LAYERS parameter.
</ServiceException>
</ServiceExceptionReport>
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 16:01
Denis Rykov
Понятно, у вас слой не правильно сконфигурирован для работы wms, не хватает секции WEB и вложенной в нее METADATA с указанием wms_title.
[ Сообщение с мобильного устройства ]
Re: mapserver5.0- неправильная картинки при другом projectio
Добавлено: 17 мар 2014, 16:17
dmitrijk
блок web уже вставлен в map (см выше)
если вы имеете в виду что надо вставить его и в блок layer типа вот так:
LAYER
WEB
METADATA
"wms_title" "layer1"
"wms_onlineresource" "
http://localhost/cgi-bin/mapserv_orig.e ... ample3.map&"
"wms_srs" "EPSG:3857"
END
END
то это приводит к ошибке:
loadLayer(): Unknown identifier. Parsing error near (WEB):(line 29)
поскольку layer не должен по идее содержать WEB
если же неправильно создан текущий web внутри map, то прошу указать на конкретную ошибку