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

Re: mapserver слои

Добавлено: 17 апр 2012, 11:47
Denis Rykov
Что значит локально лежащий, map-файл лежит на web-сервере.

Re: mapserver слои

Добавлено: 17 апр 2012, 21:25
qnx
и в параметре я указываю где на этом веб сервере искать mapserverу map файл.. так вот.... так мне и не понятно как сделать так, чтоб от параметров запроса по-разному отображался map файл..
если я правильно понял Ваш совет....

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

http://my.host.com:8880/cgi-bin/mapserv?map=/var/www/map2/hrllo.map&mode=map
как сделать так, чтоб файл hrllo.map шаблонизировался..

или я не правильно понял...?

Re: mapserver слои

Добавлено: 18 апр 2012, 05:52
Denis Rykov
Вообще-то описанный вами способ (mode=map) работы с MapServer давно устарел, используйте вместо этого стандартный приём - опубликуйте данные по WMS. Что такое OWS можно прочитать здесь, как поднять WMS - здесь (хотя инструкция довольно старая (может быть скоро обновлю) и некоторые параметры поменялись в новых версиях MapServer, но общий смысл понятен, если что-то не ясно - смотрите официальную документацию или спрашивайте здесь.

Чтобы шаблонизировать map-файл, клиент не должен ничего о нём знать, то есть в строке запроса не должно быть никаких ссылок на него. Вместо этого вам нужен враппер, то есть некоторый скрипт, который будет принимать запрос от клиента, формировать нужный map-файл на основе переданных параметров и в соответствии с этим отдавать результат обратно.

Вот тут четко объяснено для чего нужен враппер:
Frank Warmerdam писал(а):For the WMS service itself MapServer already handles the GET and POST requests for the various requests (GetCapabilities, GetMap, etc). The wrapper script is basically to predefine a few things like the location of the map file that you might not want to normally expose to the end user.

There are situations in which you might want to customize your map definition based on additional parameters passed to your service or otherwise do special stuff for some kinds of WMS requests. To support some of these use cases I implemented the so called "WxS mapscript wrapper" mechanism. This makes it possible to write a python wrapper that customizes WMS, WFS, and other services to some degree or even radically transorms incoming request into something like a WMS request with interactions with the map object.
Вот реальный пример из одного проекта, использующий python MapScript. Враппер (view_ows()) принимает на входе 2 параметра - SETTINGS и ITEMS_CLICKED, затем использует эти параметры для формирования map-файла (configure()) и используя таким образом сформированный map-файл выдаем ответ клиенту:

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

def configure(settings, **kwargs):

template_file = settings['mapserver.mapfile']
_temp_mapfile = NamedTemporaryFile(suffix=".map",delete=False)

template = Template(filename=template_file)
buf = StringIO()
ctx = Context(buf,
onlineresource=settings['mapserver.onlineresource'],
connection=settings['mapserver.connection'],
symbolset = settings['mapserver.symbolset'],
map_settings=kwargs['map_settings'],
items_clicked=kwargs['items_clicked'])
template.render_context(ctx)
_temp_mapfile.write(buf.getvalue())
_temp_mapfile.flush()

return _temp_mapfile.name


@view_config(route_name="mapserver.ows")
def view_ows(request):
import mapscript

ows_req = mapscript.OWSRequest()

for k,v in request.params.items():
ows_req.setParameter(k, urllib.unquote(v))

_settings = request.params.get('SETTINGS', '[]')
_items_clicked = request.params.get('ITEMS_CLICKED', '[]')

map_obj = mapscript.mapObj(configure(request.registry.settings,\
items_clicked=json.loads(_items_clicked),\
map_settings=json.loads(_settings)))

mapscript.msIO_installStdoutToBuffer()

map_obj.OWSDispatch(ows_req)

content_type = mapscript.msIO_stripStdoutBufferContentType()
content = mapscript.msIO_getStdoutBufferBytes()

return Response(content, content_type=content_type)

Re: mapserver слои

Добавлено: 18 апр 2012, 17:21
qnx
нам сделали слой растровый - фотографии со спутника
там три файла
.ige - 4.3Gb
.img - 19Kb
.rrd - 1.2Gb
в arcGIS оно открывается.
как к этому слою обращаться в map файле? или в какой преобразовать?
п.с. вроде еще должны его оптимизировать нам, но может это мы и сами могли бы сделать... к примеру при помощи arcGIS, или gdal ?

Re: mapserver слои

Добавлено: 19 апр 2012, 10:17
Denis Rykov
Вроде GDAL понимает этот формат, так что проблем не должно возникнуть. Кроме публикации по WMS - растр можно предварительно нарезать на тайлы и отдавать по TMS.

Re: mapserver слои

Добавлено: 25 апр 2012, 12:44
qnx
в результате получился у меня wms сервер с адресом

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

http://192.168.56.193/cgi-bin/mapserv?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities&map=/var/www/map2/fldwms.map
при помощи qgis я его открываю и смотрю.
не получается его отрисовать с помощью OpenLayers
пробую двумя вариантами из примеров, но она не дают результата

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

layer = new OpenLayers.Layer.MapServer( "World Map","http://192.168.56.193/cgi-bin/mapserv", {map: '/var/www/map2/fldwms.map'} );
					
					
layer = new OpenLayers.Layer.WMS( "NYC","http://192.168.56.193/cgi-bin/mapserv?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities&map=/var/www/map2/fldwms.map",{layers: "'fld,rd,rstr'"});
как правильно увидеть масштабируемую карты в OL ?

Re: mapserver слои

Добавлено: 25 апр 2012, 13:15
Denis Rykov
Уж если опубликовали по WMS, то никакие OpenLayers.Layer.MapServer не нужны. Второй вариант ближе к истине, но явная ошибка - REQUEST=GetCapabilities - это вообще откуда здесь взялось?? для запроса карты используется запрос GetMap, но и его и SERVICE=WMS&VERSION=1.1.1 указывать не нужно, за вас это сделает OL самостоятельно. В вашем примере URL должен выглядеть просто как

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

http://192.168.56.193/cgi-bin/mapserv?map=/var/www/map2/fldwms.map
У OL же хорошая документация и примеров использования вагон, посмотрите в примере как подключается WMS и сравните с тем, как это сделано у вас.

Re: mapserver слои

Добавлено: 25 апр 2012, 14:09
qnx
спасибо большое!
получилось.. теперь пытаюсь с помощью OL привязывать на нижний слой google map

ключ для отладки карты google для работы в локалке есть??

Re: mapserver слои

Добавлено: 25 апр 2012, 14:19
Denis Rykov
Что за ключ? Если вы про API-key, то в последних версиях он не используется.

Re: mapserver слои

Добавлено: 25 апр 2012, 14:26
qnx
да, я думал он еще применяется..

но такой код не работает

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

var gphy = new OpenLayers.Layer.Google(
                "Google Physical",
                {type: G_PHYSICAL_MAP}
            );

Re: mapserver слои

Добавлено: 25 апр 2012, 14:48
Denis Rykov

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

var lay_goo = new OpenLayers.Layer.Google('Google', {
    type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22, sphericalMercator: true, opacity: 0.5
});

Re: mapserver слои

Добавлено: 25 апр 2012, 15:09
qnx
с этим заработало, но в зависимости от выбора порядка для слоев рисует разные значения.
возможно для map файла указать прозрачный слой под моим растром, чтоб снизу там была google карта?

IMAGECOLOR 222 255 200 # этот параметр заменить прозрачным, под которым будет гугл карта?

map.addLayers([layer, lay_goo]);
map.addLayers([lay_goo, layer]);

Изображение

Изображение

на гугл карте еще вылетает окошко постоянно.

Re: mapserver слои

Добавлено: 25 апр 2012, 20:59
qnx
выложил послднюю не до конца рабочую версию в инет для Ваших замечаний в свою сторону..
http://ameno.control.ua/ol/wms/index1.html
п.с. там js с кучей комментариев..

Re: mapserver слои

Добавлено: 26 апр 2012, 07:01
Denis Rykov
Чтобы не появлялось окна из гугла, нужно при подключении их API явно указывать версию:

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

http://maps.google.com/maps/api/js?v=3.6&sensor=false
Какие еще вопросы?

Re: mapserver слои

Добавлено: 26 апр 2012, 08:54
qnx
под слоем моего растра, создаваемым wms mapserverom не видно гугл карты, хотя в мап файле я сделал прозрачность для подложки

IMAGECOLOR -1 -1 -1