如何在此处使用个性化地图样式 API

How to use a Personalized Map Style with Here API

我想自定义地图样式,找到了Map Style Editor

因此,我想在 normal.day.grey 地图方案的基础上构建并调整一些样式。地图样式编辑器以 yaml 形式提供 normal.day 方案。

  1. 是否可以将 normal.day.grey 方案作为 yaml 访问,以便我可以将其加载到编辑器中并从那里开始?
  2. 我将如何处理结果?据我从 docs 了解到,有一组预定义的方案和样式可以组合在一起。我将如何在其中使用我的自定义样式?

请区分矢量地图图块和栅格

documentation is described about raster Map Tile API - this is prerendered images (with some style) of map. You can't combine them in map view. Except only if some map image tile are partially transparent e.g. 'truck only' or 'traffic flow'。然后你可以在地图上添加两个或更多图层。

向量图块 (https://developer.here.com/documentation/vector-tiles-api/dev_guide/index.html):

是的,您可以使用 Map Style Editor

自定义矢量地图样式

矢量样式 'normal.day.grey' 不存在,但您可以从 https://demo.support.here.com/examples/v3.1/changing_the_map_style - select 上的这个示例开始 'Reduced day' 并下载它。

在这个例子中你可以找到深色风格:https://jsfiddle.net/zmeatyxv/1/

你也可以在 JS 中混合光栅瓦片和矢量瓦片添加层 API:

http://jsfiddle.net/uycv9m8x/ - 地形图在底部,矢量在顶部,参见下面的代码:

/**
 * The function add the "change" event listener to the map's style
 * and modifies colors of the map features within that listener.
 * @param  {H.Map} map      A HERE Map instance within the application
 */
function changeFeatureStyle(map){
  // get the vector provider from the vector layer
  var provider = map.getLayers().get(1).getProvider(); //get provider from vector layer

  // get the style object for the vector layer
  var vStyle = provider.getStyle();

  var changeListener = (evt) => {
    if (vStyle.getState() === H.map.Style.State.READY) {
      vStyle.removeEventListener('change', changeListener);

      // query the sub-section of the style configuration
      // the call removes the subsection from the original configuration
      var vConfig = vStyle.extractConfig([
                            'earth',
                   'landuse.wood',
                   'landuse.forest',
                   'landuse.park',
                   'landuse.builtup',
                   'landuse.national_park',
                   'landuse.nature_reserve',
                   'landuse.green-areas',
                   'landuse.other',
                   'water.small_water',
                   'water.deep_water',
                   'water.river'
                ]);
    }
  };

  vStyle.addEventListener('change', changeListener);
}

/**
 * Boilerplate map initialization code starts below:
 */

//Step 1: initialize communication with the platform
// In your own code, replace variable window.apikey with your own apikey

var platform = new H.service.Platform({
  apikey: window.apikey
});
var defaultLayers = platform.createDefaultLayers();

//Step 2: initialize a map
var map = new H.Map(document.getElementById('map'),
  defaultLayers.raster.terrain.xbase/*set terain xbase as base layer*/, {
  center: {lat: 47.60586, lng: 14.27161},
  zoom: 9,
  pixelRatio: window.devicePixelRatio || 1
});
map.addLayer(defaultLayers.vector.normal.map);//add vector layer on the top
// add a resize listener to make sure that the map occupies the whole container
window.addEventListener('resize', () => map.getViewPort().resize());

//Step 3: make the map interactive
// MapEvents enables the event system
// Behavior implements default interactions for pan/zoom (also on mobile touch environments)
var behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));

// Create the default UI components
var ui = H.ui.UI.createDefault(map, defaultLayers);

// Now use the map as required...
changeFeatureStyle(map);

http://jsfiddle.net/80jtLv16/1/ - 底部的栅格移动标签和顶部的矢量瓦片,请参见下面的代码:

function setStyle(map){
  // get the vector provider from the vector layer
  var provider = map.getLayers().get(1).getProvider(); //get provider from vector layer
  
  // Create the style object from the YAML configuration.
  // First argument is the style path and the second is the base URL to use for
  // resolving relative URLs in the style like textures, fonts.
  // all referenced resources relative to the base path https://js.api.here.com/v3/3.1/styles/omv.
  var style = new H.map.Style('https://heremaps.github.io/maps-api-for-javascript-examples/change-style-at-load/data/dark.yaml',
    'https://js.api.here.com/v3/3.1/styles/omv/');
  // set the style on the existing layer
  provider.setStyle(style);
}



/**
 * The function add the "change" event listener to the map's style
 * and modifies colors of the map features within that listener.
 * @param  {H.Map} map      A HERE Map instance within the application
 */
function changeFeatureStyle(map){
  // get the vector provider from the vector layer
  var provider = map.getLayers().get(1).getProvider(); //get provider from vector layer

  // get the style object for the vector layer
  var vStyle = provider.getStyle();

  var changeListener = (evt) => {
    if (vStyle.getState() === H.map.Style.State.READY) {
      vStyle.removeEventListener('change', changeListener);

      // query the sub-section of the style configuration
      // the call removes the subsection from the original configuration
      var vConfig = vStyle.extractConfig([
                            'earth',
                  'continent_label',
                  'road_labels',
                  'places',
                  'buildings.address-labels',
                  'roads.shields',
                   //'landuse.wood',
                   //'landuse.forest',
                   //'landuse.park',
                   'landuse.builtup',
                   'landuse.national_park',
                   'landuse.nature_reserve',
                   'landuse.green-areas',
                   'landuse.other',
                   'water.small_water',
                   'water.deep_water',
                   'water.river'
                ]);
    }
  };

  vStyle.addEventListener('change', changeListener);
}

/**
 * Boilerplate map initialization code starts below:
 */

//Step 1: initialize communication with the platform
// In your own code, replace variable window.apikey with your own apikey

var platform = new H.service.Platform({
  apikey: window.apikey
});
var defaultLayers = platform.createDefaultLayers();
var mTileServ = platform.getMapTileService({'type': 'base'});
console.log("mTileServ:", mTileServ);
var mobileLayer = mTileServ.createTileLayer('labeltile', 'normal.day.mobile', 512, 'png8', {lg: 'eng', lg2: 'eng'});

//Step 2: initialize a map
var map = new H.Map(document.getElementById('map'),
  mobileLayer/*set mobile layer as base layer*/, {
  center: {lat: 47.60586, lng: 14.27161},
  zoom: 9,
  pixelRatio: window.devicePixelRatio || 1
});
map.addLayer(defaultLayers.vector.normal.map);//add vector layer on the top
map.getLayers().add(mobileLayer); //set base layer on top - it depends what you want to achieve
//map.getLayers().add(defaultLayers.vector.normal.map); //here example how to reshuffle the layers

// add a resize listener to make sure that the map occupies the whole container
window.addEventListener('resize', () => map.getViewPort().resize());

//Step 3: make the map interactive
// MapEvents enables the event system
// Behavior implements default interactions for pan/zoom (also on mobile touch environments)
var behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));

// Create the default UI components
var ui = H.ui.UI.createDefault(map, defaultLayers);

// Now use the map as required...
setStyle(map);
changeFeatureStyle(map);