使用OpenLayers,如何在一个图层上显示不同功能的不同图标?

时间:2019-01-23 11:44:45

标签: javascript ajax gis geojson openlayers-5

首先,我总体上是Openlayers / JS的新手,并且总体上没有编程经验,因此我的代码可能还有其他我不知道的问题。

我正在使用最新版本的Openlayers(5.3.0)。

我的程序当前通过Ajax传递GeoJson格式的数据,以显示在Openlayers地图上。它为要显示的要素创建地图,视图和图层。当我按页面上的“开始”按钮时,要素将成功加载到地图上。在我的情况下,特征只是使用png标记进行可视化的具有纬度/经度的简单点。在被序列化并发送到我页面上的JS进行反序列化之前,GeoJson在C#中看起来像这样,

{{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          -1.549077,
          53.800755
        ]
      },
      "properties": {
        "GPSKey": 1,
        "Latitude": 53.800755,
        "Longitude": -1.549077,
        "TimeAdded": "2019-01-15T12:10:16",
        "IconPath": "pinred.png"
      },
      "ID": 1,
      "IconPath": null
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          -1.545077,
          53.800755
        ]
      },
      "properties": {
        "GPSKey": 2,
        "Latitude": 53.800755,
        "Longitude": -1.545077,
        "TimeAdded": "2019-01-15T12:10:16",
        "IconPath": "pinred.png"
      },
      "ID": 2,
      "IconPath": null
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          -1.524043,
          53.773222
        ]
      },
      "properties": {
        "GPSKey": 3,
        "Latitude": 53.773222,
        "Longitude": -1.524043,
        "TimeAdded": "2019-01-15T12:10:16",
        "IconPath": ""
      },
      "ID": 3,
      "IconPath": null
    }
  ]
}}

JS接收到以上序列化的代码,并使用此代码将其添加到图层中进行查看:

var geojsonFormat = new ol.format.GeoJSON({
        dataProjection: "EPSG:4326",
        featureProjection: "EPSG:3857"
    });//creates a format definition

    jsonDecoded = JSON.parse(result); /

    if (jsonDecoded.features.length > 0) {
        for (var i = 0; i < jsonDecoded.features.length; i++) {
            vectorSource.addFeature(geojsonFormat.readFeature(jsonDecoded.features[i], { featureProjection: "EPSG:3857" }));

        }

    }/

它添加到的矢量层如下所示:

var vectorLayer = new ol.layer.Vector({
    source: vectorSource,
    style: iconStyleFunc()
});

iconStyleFunc()如下所示:

function iconStyleFunc() {

    var zIndex = 1;

    var iconName = null;

    if (iconName == null) {
        iconName = "pinother.png"
    };


    iconStyle = [new ol.style.Style({
        image: new ol.style.Icon(({
            anchor: [0.5, 36], 
            anchorXUnits: "fraction",
            anchorYUnits: "pixels",
            opacity: 1,
            src: "images/" + iconName,  
            zIndex: zIndex
        })),
        zIndex: zIndex
    })];
return iconStyle;

这对于使用图标“ pinother.png”设置所有功能的样式效果很好。按下按钮时,我在地图上显示点没有问题。

我想做的是基于每个要素的GeoJson“ iconpath”属性中的图标路径应用样式,以便具有“ pinred.png”的任何要素都将使用该样式代替默认的“ pinother”。 png”,等等,将来可能需要添加各种图标。

我不确定如何读取每个功能的此属性以及如何最好地在样式函数中实现它。我设想的方式是使用iconStyleFunc()遍历功能,读取每个功能的IconPath属性,将该值附加到iconStyleFunc()的“ src / images /”路径中,然后对功能进行适当的样式设置。

1 个答案:

答案 0 :(得分:1)

使用样式函数的特征参数,您可以获取特征的属性

function iconStyleFunc(feature) {

    var zIndex = 1;

    var iconName = feature.get("IconPath") || "pinother.png";

    iconStyle = [new ol.style.Style({
        image: new ol.style.Icon(({
            anchor: [0.5, 36], 
            anchorXUnits: "fraction",
            anchorYUnits: "pixels",
            opacity: 1,
            src: "images/" + iconName,  
            zIndex: zIndex
        })),
        zIndex: zIndex
    })];
return iconStyle;