2015-07-21 2 views
-1

Раньше я использовал API Карт Google для интерфейса карты, теперь я перехожу к API-интерфейсу Here Maps. В моем приложении используются распорки и JSP. Ранее, с картами Google я загрузил скрипт и перезвонить, как так:Переключение с API Карт Google на Карту API

function loadGoogleMapsAPIScript(){ 
var script = document.createElement("script"); 
script.setAttribute("type","text/javascript"); 
var language = document.getElementsByTagName("html")[0].getAttribute("lang"); 

//we should use the same protocol as the web page: http or https. 
var href = window.location.href; 
protocol = href.substr(0, href.indexOf(':')); 

var src = protocol+"://maps.googleapis.com/maps/api/js"; 
src += "?v=3"; //Add google maps api version. 
src += "&sensor=false"; // sensor should always be false here. 
src += "&callback=google_maps_callback"; //add callback function. This function will be called 
             //after the script load successful. 
src += "&language="+language;   //add language. 
//} 
script.setAttribute("src", src); 
document.getElementsByTagName("head")[0].appendChild(script); 
} 

Callback функция:

function google_maps_callback(){ 
var map_opt = { 
    zoom: your_location.map_zoom, 
    center: new google.maps.LatLng(0,0), 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 
var obj = your_location.map_obj; 
var map = new google.maps.Map(obj, map_opt); 
var infowin = new google.maps.InfoWindow(); 
var bounds = new google.maps.LatLngBounds(); 

for (var i =0; i < your_location.count; i++){ 
    bounds = add_marker(map, i, infowin, bounds); 
} 

if (your_location.count>0){ 
    map.fitBounds(bounds); 
    google.maps.event.addListenerOnce(
     map,"bounds_changed", 
     function(event){ 
      if(map.getZoom()>your_location.map_zoom){ 
       map.setZoom(your_location.map_zoom); 
      } 
     } 
    ); 
}else{ 
    map.setZoom(1); 
} 

} 

Я создал функцию loadHereMapsAPIScript, как так:

function loadHereMapsAPIScript(){ 

var script1 = document.createElement("script1"); 
script1.setAttribute("type","text/javascript"); 
script1.setAttribute("src","http://js.api.here.com/v3/3.0/mapsjs-core.js"); 
document.getElementByTagName("head")[0].appendChild(script1); 

var script2 = document.createElement("script2"); 
script2.setAttribute("type","text/javascript"); 
script2.setAttribute("src","http://js.api.here.com/v3/3.0/mapsjs-service.js"); 
document.getElementByTagName("head")[0].appendChild(script2); 

} 

как бы Я добавляю метод обратного вызова в loadHereMapsAPIScript для вызова новой функции here_maps callback(), которая делает то же самое, что и google_maps_callback(). Я бы сначала определил платформу, для центра я бы использовал setCenter? :

function here_maps_callback(){ 
var platform = new H.service.Platform({ 
    app_id: 'myAPIId', 
    app_code: 'myAPICode' 
    useCIT: true, 
    useHTTPS: true 
}) 
var map_opt = { 
    zoom: clients_location.map_zoom, 
    center: new H.geo.Point(0,0), 

} 
} 

UPDATE

Я представил законченную функции обратного вызова для карт Здесь, которая имитирует функцию Google перезвонить. Это в сочетании с ответом ниже, данным Dr.Molle, полностью работает.

function here_maps_callback(){ 
var platform = new H.service.Platform({ 
    app_id: 'your-app-id', 
    app_code: 'your-app.code', 
    useCIT: true, 
    useHTTPS: true 
}); 

var defaultLayers = platform.createDefaultLayers(); 

var obj = your_location.map_obj; 

var map = new H.Map(
    obj, 
    defaultLayers.normal.map, 
    { 
     zoom:your_location.map_zoom, 
     center: {lat:0,lng:0} 
    }); 
var behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map)); 

var ui = H.ui.UI.createDefault(map,defaultLayers); 

for (var i =0; i < your_location.count; i++){ 
    add_marker_here(map,index); 
    } 
} 
+0

Почему вы пытаетесь загрузить mapsjs-core.js дважды? – duncan

ответ

2

здесь-API не выполняет обратный вызов, как в системе Google карт-API делает, вам нужно справиться с этим самостоятельно.

Когда вы загружаете скрипт асинхронно, вы можете добавить обработчик onload к скрипту (сценариям), в котором вы выполняете обратный вызов.

Но когда вы используете ЗДЕСЬ, вы также должны сохранять определенный порядок загрузки, поскольку для модулей существуют зависимости.

E.g. при загрузке службы -модуль вы должны убедиться, что ядро ​​ модуль уже загружен (см. https://developer.here.com/javascript-apis/documentation/v3/maps/topics/overview.html#modules для деталей)

Одним из вариантов является использование такой цепи для загрузки модулей, возможно выполнение :

function loadHereMapsAPIScript(ss){ 
     if(!ss.length)return; 
     var s=ss.shift(); 

     if(typeof s==='function'){ 
      //run the callback 
      s(); 
      return; 
     } 
     if(typeof s!=='string')return; 
     //load a module 
     var script=document.createElement("script"); 
     script.setAttribute("type","text/javascript"); 
     document.getElementsByTagName('head')[0].appendChild(script) 
     script.onload=function(){loadHereMapsAPIScript(ss);} 
     script.setAttribute('src',s); 
    } 

    loadHereMapsAPIScript(
    [ 
     //the desired modules 
     'http://js.api.here.com/v3/3.0/mapsjs-core.js', 
     'http://js.api.here.com/v3/3.0/mapsjs-service.js', 
     //the callback to be executed when all modules have been loaded 
     here_maps_callback      
    ] 
    ); 
+0

Что вы подразумеваете под (ss) – 3rdeye7

+0

, будет ли второй оператор с URL-адресами сценария и обратным вызовом в моем jsp, который затем передаст эти параметры функции loadHereMapsApi? – 3rdeye7

+0

'ss' ist аргумент передается функции (массив с URL-адресами) ... второй оператор - вызов функции. –