【问题标题】:How to add shapefiles to a Bing Map using Openlayers 3如何使用 Openlayers 3 将 shapefile 添加到 Bing 地图
【发布时间】:2015-05-27 00:12:16
【问题描述】:

我正在使用带有 Bing 地图的 Openlayers3 来构建我的应用程序。我有一个点 shapefile,想在地图上显示它。我可以使用 OpenLayers.Layer.GML() 构造使用 Openlayers2 来做到这一点,但是在尝试使用 Openlayers 3 时遇到了困难。我尝试搜索这个并且 openlayer example 给了我一个错误:“无法读取属性” ogc'未定义'。我的 shapefile 在我自己系统中的 GeoServer 上。

因此,我们非常感谢您对此事的任何帮助 :)

【问题讨论】:

    标签: openlayers-3 shapefile geoserver gml-geographic-markup-lan


    【解决方案1】:

    您链接的示例来自 OpenLayers 3 的一个非常旧的 beta 版本。您可以从上一个版本 here 中找到示例。

    您正在谈论 shapefile,但鉴于您在 OpenLayers 2 中使用了 OpenLayers.Layer.GML 并且还使用 geoservergml 标记了这篇文章,我假设您已将 shapefile 上传到 GeoServer 并使用 WFS访问数据。

    所以要查看的相关示例将是http://openlayers.org/en/v3.3.0/examples/vector-wfs.html。该示例使用 JSONP 作为传输。在您的情况下,使用本地 GeoServer,您的矢量源定义会更简单一些,看起来像这样:

    var vectorSource = new ol.source.ServerVector({
      format: new ol.format.GeoJSON(),
      loader: function(extent, resolution, projection) {
        var url = 'geoserver/wfs?service=WFS&version=1.1.0&' +
            'request=GetFeature&typename=osm:water_areas&outputFormat=json' +
            '&srsname=EPSG:3857&bbox=' + extent.join(',') + ',EPSG:3857';
        $.ajax(url).then(function(response) {
          vectorSource.addFeatures(vectorSource.readFeatures(response));
        });
      },
      strategy: ol.loadingstrategy.createTile(new ol.tilegrid.XYZ({
        maxZoom: 19
      }))
    });
    

    在上面的 sn-p 中,您必须将 osm:water_areas 替换为您的工作区和图层(功能类型)名称。

    要在矢量图层中使用该源,如果您不想要默认的蓝色填充,还可以添加一些样式。下图仅使用 2 像素宽的蓝色轮廓呈现特征:

    var vector = new ol.layer.Vector({
      source: vectorSource,
      style: new ol.style.Style({
        stroke: new ol.style.Stroke({
          color: 'rgba(0, 0, 255, 1.0)',
          width: 2
        })
      })
    });
    

    【讨论】:

    • 感谢您的及时回复。我听从了您的帮助,并输入了我的图层名称和本地地理服务器地址。但我在地图上看不到任何东西。有什么我想念的吗?
    • 这是我更改的代码:var url = 'geoserver/cite/ows?service=WFS&' + 'version=1.0.0&request=GetFeature&typeName=' + 'usgs' + '&' + 'outputFormat =text/javascript&format_options=callback:loadFeatures' + '&srsname=EPSG:3857&bbox=' + extent.join(',') + ',EPSG:3857';
    • JSONP 可能在您的 GeoServer 上被停用。但是,如果您使用本地 GeoServer,则不需要它。我将编辑我的答案,向您展示如何在没有 JSONP 的情况下做到这一点。
    • 感谢@ahocevar,但无论如何我可以测试 URL 以查看我得到的结果是否真的可以使用。我的意思是我在控制台或任何地方都没有看到任何可能导致我得出结论的错误,甚至 bbox 也不是一种边界框,因为我需要的只是坐标。
    • 我明白了!感谢您的回复,这对我很有帮助。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多