OpenLayers: OpenLayers.Protocol.Script

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3370
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 518
Ваше звание: Author
Контактная информация:

OpenLayers: OpenLayers.Protocol.Script

Сообщение Denis Rykov » 13 дек 2011, 07:34

Наиболее распространенным способом обхода правила ограничения домена (same origin policy) в OpenLayers является использование прокси-сервера. Но с недавних пор появилась еще одна возможность - использовать JSONP: OpenLayers.Protocol.Script, пример использования показан здесь. В качестве формата данных, передаваемых внутри JSONP может использоваться любой формат, понимаемый OpenLayers. Важной особенностью использования JSONP является обязательная поддержка сервером возможности оборачивания ответа в callback функцию, то есть на запрос вида server.adress?callback=cb, сервер должен отдавать результат в виде cb('ответ'). А что же делать, если на сервере такой возможности нет? Например, мы хотим подключить слой землетрясений, отдаваемый USGS в формате GeoRSS (xml). Здесь нам поможет удобный online-сервис jsonpwrapper.com, оборачивающий результат ответа какого-либо сервера в callback-функцию. В нашем случае запрос будет выглядеть так:

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

http://jsonpwrapper.com/?urls[]=http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml
А ответ так:

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

console.log([{"body":"<?xml version=\"1.0\"?>...
То есть по умолчанию (если не был передан параметр callback в запросе) jsonpwrapper.com оборачивает ответ в функцию console.log. В конечном итоге создание слоя в OpenLayers будет выглядеть так:

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

var usgs = new OpenLayers.Layer.Vector("Earthquakes", {
    projection: new OpenLayers.Projection("EPSG:4326"),
    strategies: [new OpenLayers.Strategy.Fixed()],
    protocol: new OpenLayers.Protocol.Script({
        url: "http://jsonpwrapper.com/?urls[]=http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml",
        format: new OpenLayers.Format.GeoRSS(),
        parseFeatures: function(data) {
            return this.format.read(data[0]['body'])
        }
    })
}); 
Результат
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Рецепты»

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

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