OpenLayers图标不会显示

时间:2018-06-11 18:59:55

标签: javascript html5 thymeleaf openlayers openstreetmap

我有一个基本的SpringBoot应用程序。使用Spring Initializer,JPA,嵌入式Tomcat,Thymeleaf模板引擎和包作为可执行的JAR文件。我有一个Thymeleaf,它显示了带有Icon的OpenLayers 4库的地图,但Icon没有显示在地图的任何地方

<div id="Map" class="map"></div>
<div id="popup"></div>
<div></div>
<script src="https://openlayers.org/en/v4.6.5/build/ol.js"></script>
<script th:inline="javascript">
  /*<![CDATA[*/

  var lat = /*[[${lat}]]*/ ;
  var lng = /*[[${lng}]]*/ ;

  var iconFeature = new ol.Feature({
    geometry: new ol.geom.Point([lng, lat]),
    name: 'The icon',
    population: 4000,
    rainfall: 500
  });

  var iconStyle = new ol.style.Style({
    image: new ol.style.Icon( /** @type {olx.style.IconOptions} */ ({
      anchor: [0.5, 46],
      anchorXUnits: 'fraction',
      anchorYUnits: 'pixels',
      src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png'
    }))
  });

  iconFeature.setStyle(iconStyle);

  var vectorSource = new ol.source.Vector({
    features: [iconFeature]
  });

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

  var rasterLayer = new ol.layer.Tile({
    source: new ol.source.TileJSON({
      url: 'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure',
      crossOrigin: ''
    })
  });

  var map = new ol.Map({
    layers: [rasterLayer, vectorLayer,
      new ol.layer.Tile({
        source: new ol.source.OSM()
      })
    ],
    target: 'Map',
    controls: ol.control.defaults({
      attributionOptions: {
        collapsible: false
      }
    }),
    view: new ol.View({
      center: ol.proj.fromLonLat([lng, lat]),
      zoom: 14
    })
  });
  /*]]>*/

</script>
</div>

1 个答案:

答案 0 :(得分:2)

您有几个问题:

  1. 您没有将坐标投影到正确的投影:
  2. var iconFeature = new ol.Feature({
      geometry: new ol.geom.Point(ol.proj.transform([lng, lat], 'EPSG:4326', 'EPSG:3857')),
      name: 'The icon',
      population: 4000,
      rainfall: 500
    });
    
    1. 一旦我这样做,图标会短暂出现然后消失,除非我改变了这个:
    2. var map = new ol.Map({
        layers: [rasterLayer, vectorLayer],
        target: 'Map',
        controls: ol.control.defaults({
          attributionOptions: {
            collapsible: false
          }
        }),
        view: new ol.View({
          center: ol.proj.fromLonLat([lng, lat]),
          zoom: 5
        })
      });
      

      proof of concept fiddle

      screenshot of resulting map

      如果您不想要'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure'磁贴,请更改:

      var rasterLayer = new ol.layer.Tile({
        source: new ol.source.TileJSON({
          url: 'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure',
          crossOrigin: ''
        })
      });
      

      要:

      var rasterLayer = new ol.layer.Tile({
        source: new ol.source.OSM()
      });
      

      proof of concept fiddle

      screenshot of resulting map

      代码段

      var lat = 42;
      var lng = -75;
      
      var iconFeature = new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.transform([lng, lat], 'EPSG:4326', 'EPSG:3857')),
        name: 'The icon',
        population: 4000,
        rainfall: 500
      });
      
      var iconStyle = new ol.style.Style({
        image: new ol.style.Icon( /** @type {olx.style.IconOptions} */ ({
          anchor: [0.5, 46],
          anchorXUnits: 'fraction',
          anchorYUnits: 'pixels',
          src: 'https://openlayers.org/en/v4.6.5/examples/data/icon.png'
        }))
      });
      
      iconFeature.setStyle(iconStyle);
      
      var vectorSource = new ol.source.Vector({
        features: [iconFeature]
      });
      
      var vectorLayer = new ol.layer.Vector({
        source: vectorSource
      });
      
      var rasterLayer = new ol.layer.Tile({
        source: new ol.source.OSM()
      });
      
      var map = new ol.Map({
        layers: [rasterLayer, vectorLayer],
        target: 'Map',
        controls: ol.control.defaults({
          attributionOptions: {
            collapsible: false
          }
        }),
        view: new ol.View({
          center: ol.proj.fromLonLat([lng, lat]),
          zoom: 5
        })
      });
      html,
      body,
      .map {
        height: 100%;
        width: 100%;
        margin: 0px;
        padding: 0px
      }
      <div id="Map" class="map"></div>
      <div id="popup"></div>
      <script src="https://openlayers.org/en/v4.6.5/build/ol.js"></script>