mapserver слои

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

Re: mapserver слои

Сообщение Denis Rykov » 17 апр 2012, 11:47

Что значит локально лежащий, map-файл лежит на web-сервере.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 17 апр 2012, 21:25

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

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

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

или я не правильно понял...?
КОЖЗГСФ

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

Re: mapserver слои

Сообщение Denis Rykov » 18 апр 2012, 05:52

Вообще-то описанный вами способ (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)
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 18 апр 2012, 17:21

нам сделали слой растровый - фотографии со спутника
там три файла
.ige - 4.3Gb
.img - 19Kb
.rrd - 1.2Gb
в arcGIS оно открывается.
как к этому слою обращаться в map файле? или в какой преобразовать?
п.с. вроде еще должны его оптимизировать нам, но может это мы и сами могли бы сделать... к примеру при помощи arcGIS, или gdal ?
КОЖЗГСФ

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

Re: mapserver слои

Сообщение Denis Rykov » 19 апр 2012, 10:17

Вроде GDAL понимает этот формат, так что проблем не должно возникнуть. Кроме публикации по WMS - растр можно предварительно нарезать на тайлы и отдавать по TMS.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 25 апр 2012, 12:44

в результате получился у меня 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 ?
КОЖЗГСФ

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

Re: mapserver слои

Сообщение Denis Rykov » 25 апр 2012, 13:15

Уж если опубликовали по 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 и сравните с тем, как это сделано у вас.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 25 апр 2012, 14:09

спасибо большое!
получилось.. теперь пытаюсь с помощью OL привязывать на нижний слой google map

ключ для отладки карты google для работы в локалке есть??
КОЖЗГСФ

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

Re: mapserver слои

Сообщение Denis Rykov » 25 апр 2012, 14:19

Что за ключ? Если вы про API-key, то в последних версиях он не используется.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 25 апр 2012, 14:26

да, я думал он еще применяется..

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

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

var gphy = new OpenLayers.Layer.Google(
                "Google Physical",
                {type: G_PHYSICAL_MAP}
            );
КОЖЗГСФ

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

Re: mapserver слои

Сообщение Denis Rykov » 25 апр 2012, 14:48

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

var lay_goo = new OpenLayers.Layer.Google('Google', {
    type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22, sphericalMercator: true, opacity: 0.5
});
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 25 апр 2012, 15:09

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

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

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

Изображение

Изображение

на гугл карте еще вылетает окошко постоянно.
КОЖЗГСФ

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 25 апр 2012, 20:59

выложил послднюю не до конца рабочую версию в инет для Ваших замечаний в свою сторону..
http://ameno.control.ua/ol/wms/index1.html
п.с. там js с кучей комментариев..
КОЖЗГСФ

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

Re: mapserver слои

Сообщение Denis Rykov » 26 апр 2012, 07:01

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

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

http://maps.google.com/maps/api/js?v=3.6&sensor=false
Какие еще вопросы?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
qnx
Участник
Сообщения: 61
Зарегистрирован: 13 апр 2012, 12:10
Репутация: 0
Откуда: город-герой Киев

Re: mapserver слои

Сообщение qnx » 26 апр 2012, 08:54

под слоем моего растра, создаваемым wms mapserverom не видно гугл карты, хотя в мап файле я сделал прозрачность для подложки

IMAGECOLOR -1 -1 -1
КОЖЗГСФ

Ответить

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

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

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