OpenLayers: OpenLayers.Protocol.Script
Добавлено: 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-функцию. В нашем случае запрос будет выглядеть так:
А ответ так: То есть по умолчанию (если не был передан параметр callback в запросе) jsonpwrapper.com оборачивает ответ в функцию console.log. В конечном итоге создание слоя в OpenLayers будет выглядеть так:
Результат
Код: Выделить всё
http://jsonpwrapper.com/?urls[]=http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml
Код: Выделить всё
console.log([{"body":"<?xml version=\"1.0\"?>...
Код: Выделить всё
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'])
}
})
});