Неверно сформированный WFS XMLHttpRequest от GWT-openlayers в IE11
Я попытался воспроизвести один из примеров витрины GWT-openlayers, включающих запросы WFS ( этот). Я сохранил код и просто изменил его, чтобы он был простым Composite вместо абстрактного примера, например так:
public class Example extends Composite {
public Example() {
buildPanel();
}
public void buildPanel() {
OpenLayers.setProxyHost("olproxy?targetURL=");
//create some MapOptions
MapOptions defaultMapOptions = new MapOptions();
defaultMapOptions.setNumZoomLevels(16);
MapWidget mapWidget = new MapWidget("500px", "500px", defaultMapOptions);
Map map = mapWidget.getMap();
WMSParams wmsParams = new WMSParams();
wmsParams.setFormat("image/png");
wmsParams.setLayers("topp:states");
wmsParams.setStyles("");
WMSOptions wmsLayerParams = new WMSOptions();
wmsLayerParams.setUntiled();
wmsLayerParams.setTransitionEffect(TransitionEffect.RESIZE);
String wmsUrl = "http://demo.opengeo.org/geoserver/wms";
WMS wmsLayer = new WMS("Basic WMS", wmsUrl, wmsParams, wmsLayerParams);
//Create a WFS layer
WFSProtocolOptions wfsProtocolOptions = new WFSProtocolOptions();
wfsProtocolOptions.setUrl("http://demo.opengeo.org/geoserver/wfs");
wfsProtocolOptions.setFeatureType("states");
wfsProtocolOptions.setFeatureNameSpace("http://www.openplans.org/topp");
//if your wms is in a different projection use wfsProtocolOptions.setSrsName(LAMBERT72);
WFSProtocol wfsProtocol = new WFSProtocol(wfsProtocolOptions);
VectorOptions vectorOptions = new VectorOptions();
vectorOptions.setProtocol(wfsProtocol);
vectorOptions.setStrategies(new Strategy[]{new BBoxStrategy()});
//if your wms is in a different projection use vectorOptions.setProjection(LAMBERT72);
final Vector wfsLayer = new Vector("wfsExample", vectorOptions);
wfsLayer.setFilter(new FeatureIdFilter(new String[]{"states.30"}));
//note that you can request the FID of a VectorFeature using getFID()
map.addLayer(wmsLayer);
map.addLayer(wfsLayer);
//Lets add some default controls to the map
map.addControl(new LayerSwitcher()); //+ sign in the upperright corner to display the layer switcher
map.addControl(new OverviewMap()); //+ sign in the lowerright to display the overviewmap
map.addControl(new ScaleLine()); //Display the scaleline
//Center and zoom to a location
map.setCenter(new LonLat(-100, 40), 4);
initWidget(mapWidget);
mapWidget.getElement().getFirstChildElement().getStyle().setZIndex(0); //force the map to fall behind popups
}
}
Я развернул свое приложение GWT, содержащее эту панель, и запустил его в Internet Explorer 11. Используя инструменты разработчика, я исследовал WFS XMLHttpRequest, который запрашивает функцию с указанным идентификатором. Запрос XML был следующим:
<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">
<wfs:Query typeName="feature:states" xmlns:NS1="" NS1:xmlns:feature="http://www.openplans.org/topp">
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:And>
<ogc:FeatureId fid="states.30" />
<ogc:BBOX>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:coordinates decimal="." cs="," ts=" ">-143.9453125,-3.9453125 -56.0546875,83.9453125</gml:coordinates>
</gml:Box>
</ogc:BBOX>
</ogc:And>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>
Тот же запрос, исходящий из примера демонстрации, выглядит так:
<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">
<wfs:Query typeName="feature:states" xmlns:feature="http://www.openplans.org/topp">
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:And>
<ogc:FeatureId fid="states.30"/>
<ogc:BBOX>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:coordinates decimal="." cs="," ts=" ">-143.9453125,-3.9453125 -56.0546875,83.9453125</gml:coordinates>
</gml:Box>
</ogc:BBOX>
</ogc:And>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>
Они одинаковы, за исключением этого бита в строке 2:...xmlns: NS1 = "" NS1: xmlns: feature =... Это проблема, так как это делает мой запрос не разбираемым Geoserver (он говорит org.xml.sax.SAXParseException: значение атрибута "prefix="xmlns",localpart="ns1",rawname="xmlns:ns1"" недопустимо. Привязки с префиксом пространства имен могут быть не пустыми). Похоже, что это происходит и для разных типов фильтров функций WFS (то есть логических). Более того, это происходит только в IE11. Запрос правильно построен при работе на Firefox и Chrome. Я использую GWT 2.5.1 и GWT-openlayers 1.0.
Мне нужно, чтобы это работало, но я не мог выяснить, что вызывает это аномальное поведение в IE...
2 ответа
Это похоже на известную ошибку в IE11.
Источник: http://osgeo-org.1560.x6.nabble.com/WFS-and-IE-11-td5090636.html
Обходной путь должен переписать метод OpenLayers.Format.XML.write одним, который удаляет некоторый мошеннический текст (автор: Стивен Бэтти с модификацией из krooole):
var _class = OpenLayers.Format.XML;
var originalWriteFunction = _class.prototype.write;
var patchedWriteFunction = function() {
var child = originalWriteFunction.apply( this, arguments );
// NOTE: Remove the rogue namespaces as one block of text.
child = child.replace(new RegExp('xmlns:NS\\d+="" NS\\d+:', 'g'), '');
return child;
}
_class.prototype.write = patchedWriteFunction;
Работает ли при удалении следующей строки?
OpenLayers.setProxyHost("olproxy?targetURL=");