我已经用谷歌搜索试图找到答案,但没有。
我正在创建一个网站,用户可以搜索并选择带有Google地理编码API的地方,然后我会获得该地点的边界,但是之后用户应该可以增加这些边界。
例如,用户可以在5公里内增加距离该地点的距离,因此我可以在5公里内增加界限。
这是用户seacrh某个地方的结果:
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 42.15420480,
"lng" : -6.19020910
},
"southwest" : {
"lat" : 32.403740,
"lng" : -31.2751580
}
},
现在我需要增加5公里的界限。 考虑到我必须将km转换为度数,我怎么能在javascript中做到这一点?
非常感谢。
修改
我试着感谢@geocodezip,但事情并非如此。我试着说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 :(得分: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