Как бы я рассчитал расстояние между точками Google Maps Api V3 - PullRequest
1 голос
/ 08 марта 2012

Я работаю над проектом, и он почти завершен. Проблема в том, что я довольно новичок в Javascript и не могу понять, как сделать что-то, что, вероятно, довольно просто. Вот часть моего кода:

var dista;
var p;
var addrbounds;
var addrlat;
var addrlng;
var addr;

var icon = new google.maps.MarkerImage("http://maps.google.com/mapfiles/ms/micons/red.png",

new google.maps.Size(32, 32), new google.maps.Point(0, 0),

new google.maps.Point(16, 32));

var center = null;
var map = null;
var currentPopup;
var bounds = new google.maps.LatLngBounds();

function addMarker(lat, lng, info) {

var address = document.myform.customer.value;
var geocoder = new google.maps.Geocoder();

geocoder.geocode({address: address}, function(results, status) {

if (status == google.maps.GeocoderStatus.OK) {

var addrbounds = results[0].geometry.location; //get geocoded results into variable
var addrlat = results[0].geometry.location.lat();
var addrlng = results[0].geometry.location.lng();
var p = new google.maps.LatLng(addrlat, addrlng);
var pt1 = new google.maps.LatLng(lat, lng);

dista = pt1.distanceFrom(p); //calculate distance between the points

var di = (dista/1000);

document.myform1.memory.value = di; //add dist to memory text box

return;

} else {

alert(address + ' not found');

}

});

// desired spot for if statement regarding distance

var pt = new google.maps.LatLng(lat, lng);

bounds.extend(pt);

var marker = new google.maps.Marker({

position: pt,

icon: icon,

map: map

});

var popup = new google.maps.InfoWindow({
content: info,
maxWidth: 300

});

google.maps.event.addListener(marker, "click", function() {

if (currentPopup != null) {

currentPopup.close();
currentPopup = null;

}

popup.open(map, marker);

currentPopup = popup;

});

google.maps.event.addListener(popup, "closeclick", function() {

map.panTo(center);

currentPopup = null;

});

}

По сути, первое, что происходит в функции addMarker (), - это геокодирование адреса, а затем вычисление расстояния от адреса. Это работает просто отлично. Проблема возникает, когда требуется получить расстояние от геокодера, чтобы создать оператор if, который добавляет маркеры только из базы данных, если она находится в пределах определенного радиуса. Как видите, я пытаюсь переместить его в текстовое поле. Кажется, это работает, но это часть цикла и не будет обновляться при каждом запуске цикла.

Я застрял на пару дней, поэтому любая помощь будет оценена. Я ненавижу быть так близко к завершению, но застрял!

Edit:

Я получил это на работу. Вот как я это сделал:

var dista;    

var p;

var addrbounds;

var addrlat;

var addrlng;

var icon = new google.maps.MarkerImage("http://maps.google.com/mapfiles/ms/micons/red.png",

new google.maps.Size(32, 32), new google.maps.Point(0, 0),

new google.maps.Point(16, 32));

var center = null;

var map = null;

var currentPopup;

var bounds = new google.maps.LatLngBounds();

function addMarker(lat, lng, info) {    

var address = document.myform.customer.value;

var geocoder = new google.maps.Geocoder();

geocoder.geocode({address: address}, function(results, status) {

  if (status == google.maps.GeocoderStatus.OK) {

  var addrbounds = results[0].geometry.location;

  var addrlat = results[0].geometry.location.lat();

  var addrlng = results[0].geometry.location.lng();

  var p = new google.maps.LatLng(addrlat, addrlng);

  var pt1 = new google.maps.LatLng(lat, lng);

  dista = pt1.distanceFrom(p);

  var di = (dista/1000);

  document.myform1.memory.value = di;

  document.myform1.memory1.value = addrlat;

  document.myform1.memory2.value = addrlng;

  return;

} else {

  alert(address + ' not found');

}

 });

var tstlat = document.myform1.memory1.value;

var tstlng = document.myform1.memory2.value;

var tstpt = new google.maps.LatLng(tstlat, tstlng);

var pt = new google.maps.LatLng(lat, lng);

var distan = pt.distanceFrom(tstpt);

var tstdistance = (distan/1000);

if (tstdistance < 20){

// alert (tstdistance);

bounds.extend(pt);

var marker = new google.maps.Marker({

position: pt,

icon: icon,

map: map

});

var popup = new google.maps.InfoWindow({

content: info,

maxWidth: 300

});

google.maps.event.addListener(marker, "click", function() {

if (currentPopup != null) {

currentPopup.close();

currentPopup = null;
}  
popup.open(map, marker);

currentPopup = popup;

});

google.maps.event.addListener(popup, "closeclick", function() {

map.panTo(center);

currentPopup = null;

});

}

else

 {

 return;

 }}

Теперь мне просто нужно исправить проблему с обновлением карты, и проект завершится!

1 Ответ

0 голосов
/ 08 марта 2012

Вы не можете получить ничего из геокодера-обратного вызова, геокодирование вызывает асинхронный запрос, который вы никогда не узнаете из-за обратного вызова при получении ответа.

Вместо получения чего-либо извне, вы должны выдвинуть что-то наружу из обратного вызова (как вы уже сделали это, установив значение текстового поля). Вы также можете вызвать другую функцию из обратного вызова и указать расстояние в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...