2013-02-01 65 views
2

我正在嘗試在OpenLayers地圖上顯示WFS圖層。以下是 GETCAPABILITIES響應的適當部分。如何在OpenLayers中正確配置WFS圖層?

<ows:Operation name="GetFeature"> 
    <ows:DCP> 
    <ows:HTTP> 
     <ows:Get xlink:href="http://localhost/MapServer/Default.aspx"/> 
     <ows:Post xlink:href="http://localhost/MapServer/Default.aspx"/> 
    </ows:HTTP> 
    </ows:DCP> 
    <ows:Parameter name="resultType"> 
    <ows:Value>results</ows:Value> 
    <ows:Value>hits</ows:Value> 
    </ows:Parameter> 
    <ows:Parameter name="outputFormat"> 
    <ows:Value>text/xml; subtype=gml/3.1.1</ows:Value> 
    </ows:Parameter> 
</ows:Operation> 
<ows:Parameter name="srsName"> 
    <ows:Value>EPSG:4326</ows:Value> 
</ows:Parameter> 
<ows:Constraint name="DefaultMaxFeatures"> 
    <ows:Value>20000</ows:Value> 
</ows:Constraint> 

我想顯示的功能:

<wfs:FeatureType> 
    <wfs:Name>Data_ACTIVE</wfs:Name> 
    <wfs:Title/> 
    <wfs:Abstract/> 
    <ows:Keywords/> 
    <wfs:DefaultSRS>EPSG:4326</wfs:DefaultSRS> 
    <wfs:OutputFormats> 
    <wfs:Format>text/xml; subtype=gml/3.1.1</wfs:Format> 
    </wfs:OutputFormats> 
    <ows:WGS84BoundingBox> 
    <ows:LowerCorner>-102.01545715332 28.970645904541</ows:LowerCorner> 
    <ows:UpperCorner>-71.021598815918 43.1671752929688</ows:UpperCorner> 
    </ows:WGS84BoundingBox> 
</wfs:FeatureType> 

這裏是我使用的代碼:

$(document).ready(
    function() { 
     // allow testing of specific renderers via "?renderer=Canvas", etc 
     var renderer = OpenLayers.Util.getParameters(window.location.href).renderer; 
     renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers; 
     var geographic = new OpenLayers.Projection("EPSG:4326"); 
     var mercator = new OpenLayers.Projection("EPSG:900913"); 

     map = new OpenLayers.Map({ 
      div: "map", 
      layers: [ 
       new OpenLayers.Layer.WMS("OpenLayers WMS", 
        "http://vmap0.tiles.osgeo.org/wms/vmap0", 
        { layers: "basic" } 
       ), 
       new OpenLayers.Layer.Vector("GML", { 
        strategies: [new OpenLayers.Strategy.Fixed()], 
        protocol: new OpenLayers.Protocol.WFS({ 
          url: "http://localhost/MapServer/Default.aspx", 
          featureType: "Data_ACTIVE", 
          featureNS: "http://www.tstgis.org/gml", 
          version: "1.1.0", 
          geometryName: "line" 
         }), 
         renderers: renderer 
        }) 
      ], 
      zoom: 15 
     }); 

     var bb = new OpenLayers.Bounds(-179.821327209473, 12.1057098342161, -56.5289154052734, 78.1442901657839); 
     map.zoomToExtent(bb); 
}); 

我看到POST請求正在向服務器發出圖層和返回的結果,但根本不顯示。爲什麼圖層不顯示?任何幫助,將不勝感激。

注意
這個測試腳本是在本地主機/地圖服務器上運行的HTML外殼的一部分,所以它排除了熟悉的跨域問題。

回答

1

我毫不懷疑這是OpenLayers的配置問題。根據我對OpenLayers的瞭解,我已經正確配置了它。原來,在我的情況下,設置featurePrefix選項是非常重要的。原因是每個FeatureMember節點的XML響應(GML)中的名稱空間和前綴用於標識響應的相應閱讀器。默認情況下,featurePrefix被設置爲'feature'。如果響應的名稱空間+前綴與OpenLayers中的配置不匹配,則這些功能不會添加到圖層中,因此不會顯示。在我的情況下,前綴被設置爲空字符串,因爲服務器不會向響應添加前綴。

此外,設置geometryName是至關重要的。 geometryName的缺省值是WFS版本1.0的'the_geom',高版本則爲null。 geometryName由服務器用於實際定位要素。就我而言,服務器上使用的geometryName是「msGeometry」。

這裏是工作代碼。

$(document).ready(
function() { 
    // allow testing of specific renderers via "?renderer=Canvas", etc 
    var renderer = OpenLayers.Util.getParameters(window.location.href).renderer; 
    renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers; 
    var geographic = new OpenLayers.Projection("EPSG:4326"); 
    var mercator = new OpenLayers.Projection("EPSG:900913"); 

    map = new OpenLayers.Map({ 
     div: "map", 
     layers: [ 
      new OpenLayers.Layer.WMS("OpenLayers WMS", 
       "http://vmap0.tiles.osgeo.org/wms/vmap0", 
       { layers: "basic" } 
      ), 
      new OpenLayers.Layer.Vector("GML", { 
       strategies: [new OpenLayers.Strategy.Fixed()], 
       protocol: new OpenLayers.Protocol.WFS({ 
         url: "http://localhost/MapServer/Default.aspx", 
         featureType: "Data_ACTIVE", 
         version: "1.1.0", 
         geometryName: "msGeometry", 
         featurePrefix: "" 
        }), 
        renderers: renderer 
       }) 
     ], 
     zoom: 15 
    }); 

    var bb = new OpenLayers.Bounds(-179.821327209473, 12.1057098342161, -56.5289154052734, 78.1442901657839); 
    map.zoomToExtent(bb); 

});