2013-05-29 35 views
-2

我已经试图找到答案,但没有。如何增加谷歌地图API的距离?

我创建一个网站,用户可以搜索并选择与谷歌的地理编码API的地方,然后我得到那个地方的界限,但随后用户应该能够提高这些界限。

例如,用户可以在5公里增加距离那个地方,所以我将能够增加5公里界限。

这是结果,当一些地方的用户seacrh:

"geometry" : { 
     "bounds" : { 
      "northeast" : { 
       "lat" : 42.15420480, 
       "lng" : -6.19020910 
      }, 
      "southwest" : { 
       "lat" : 32.403740, 
       "lng" : -31.2751580 
      } 
     }, 

现在我需要增加边界与5公里。 考虑到我必须将km转换为度数,我该如何在JavaScript中做到这一点?

非常感谢。

编辑

我tryed这得益于@geocodezip但事情并不qorking。我试着说“here”在“目的地点给定的距离和从起点的方位”,但有些东西是不正确的。这是代码:

//convert decimal to degree 
function getDD2DMS(dms, type){ 
    var sign = 1, Abs=0; 
    var days, minutes, secounds, direction; 

    if(dms < 0) { sign = -1; } 
    Abs = Math.abs(Math.round(dms * 1000000.)); 
    //Math.round is used to eliminate the small error caused by rounding in the computer: 
    //e.g. 0.2 is not the same as 0.20000000000284 
    //Error checks 
    if(type == 'lat' && Abs > (90 * 1000000)){ 
     //alert(' Degrees Latitude must be in the range of -90. to 90. '); 
     return false; 
    } else if(type == 'lng' && Abs > (180 * 1000000)){ 
     //alert(' Degrees Longitude must be in the range of -180 to 180. '); 
     return false; 
    } 
    days = Math.floor(Abs/1000000); 
    minutes = Math.floor(((Abs/1000000) - days) * 60); 
    secounds = (Math.floor(((((Abs/1000000) - days) * 60) - minutes) * 100000) *60/100000).toFixed(); 
    days = days * sign; 
    if(type == 'lat') direction = days<0 ? 'S' : 'N'; 
    if(type == 'lng') direction = days<0 ? 'W' : 'E'; 
    //else return value  
    return (days * sign) + 'º ' + minutes + "' " + secounds + "'' " + direction; 
} 

//calculate 
    var R = 6371; // km 
    var d = 10; //km 
    var brng = 0; //0 vertical, 90 horizontal 
    var lat1 = (42.15420480).toRad(); 
    var lon1 = (-6.19020910).toRad(); 
    var lat2 = Math.asin(Math.sin(lat1)*Math.cos(d/R) + Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng)); 
    var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2)); 

    console.log('lat2 = ' + getDD2DMS(lat2, 'lat')); 
    console.log('lon2 = ' + getDD2DMS(lon2, 'lng')); 

结果与链接不一样。 帮帮我。非常感谢你。

+0

问问题不是更好吗,而不是负面评估问题?谢谢。的 – Pedro

+0

可能重复[如何从度转化为米的距离?(http://stackoverflow.com/questions/4102520/how-to-transform-a-distance-from-degrees-to-metres) – duncan

+0

@duncan谢谢,但这个想法并不是把度数转换成度量,而是相反,公里或度量转化为度数,或者至少知道多少度数等于1km(或者更小)。 – Pedro

回答

0

我不完全明白你的问题,但你可以尝试画一个边框,并通过使用范围为偏置发送搜索。

var bounds; 
google.maps.event.addListener(drawingManager, 'rectanglecomplete', function (rectangle) { 
    bounds = rectangle.getBounds(); 
    //search 
    google.maps.event.addListener(rectangle, 'bounds_changed', function() { 
      bounds = rectangle.getBounds(); 
      //search 
    } 
} 

//this is a copy of the search function in my app 
function codeAddress(type, geo) { 
var bounds = map.getBounds(); //get the current map bounds (should not be greater than the bounding box) 
geocoder.geocode({ 'address': geo, 'bounds': bounds }, function (results, status) { //geocode the lat/long of incoming with a bias towards the bounds 
    if (status == google.maps.GeocoderStatus.OK) { //if it worked 
     map.setCenter(results[0].geometry.location); //set the center of map to the results 
     testBounds(); //test to make sure we are indeed in the bounds (have to do this because gmaps only allows for a BIAS of bounds and is not strict) 
     if (mapInBounds == "yes") { //if it is inside bounds 
      if (searchCount > 0) { //check to see if this is the first time searched, if not 
       searchResult.setMap(null); //set old search result to not display on map 
      } else { //if it is the first time 
       searchCount++; //just interate 
      } 
      searchResult = new google.maps.Marker({ //create a new marker 
       map: map, //add to current map 
       position: results[0].geometry.location //set position to search results 
      }); 
      document.getElementById("search_results").innerHTML = "<div id=\"searchResult\">" + geo + " <a href=\"#\" onclick=\"searchResultDeleteMe();\"><img src=\"images/delete.png\"/></a></div><br\>"; //add list div 
     } else { //if location found was outside strict map bounds... 
      displayMessage("Could not find within bounds."); //say so 
     } 

    } else { //if the entire geocode did not work 
     alert(L6); //localization... 
    } 
}); 
}    //get the location of a lat/long or address 
function codeLatLng(latlng) { 
if (geocoder) { 
    geocoder.geocode({ 'latLng': latlng }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       document.getElementById("rgItem").innerHTML = results[0].formatted_address; 
      } 
      else { 
       document.getElementById("rgItem").innerHTML = "Geocoder failed due to: " + status; 
       document.getElementById("rgItem").innerHTML = ""; 
      } 
     } 
    }); 
} 
}     //get th