2014-02-17 3 views
1

Я программист-любитель и работаю над проектом, который я имею в виду, используя API карт google. Короче говоря, я пытаюсь создать переменную со средней долготой и широтой n числа точек. Я до такой степени, что у меня есть массив координат lng/lat, но я изо всех сил пытаюсь преобразовать их в формат, который я могу использовать в качестве входа для метода LatLng для карт Google.Средняя проблема с Lng/Lat NaN

Я уже упоминал этот вопрос SO Find the average (center) of lats/lngs и множество других сайтов в течение месяца, но я не смог понять или реализовать решение. Я чувствую, что мне не хватает простых вещей, но я уже несколько месяцев стучал головой об этом, и никуда не денусь. Любые советы или помощь с этим будут оценены.

//GOOGLE MAPS API SCRIPTS 
var streetarray = document.getElementsByName("street"); 
var cityarray = document.getElementsByName("city"); 
var geocoder; 
var map; 
var results; 
var mapArray = new Array(); 
var avgLat; 
var avgLng; 


function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(-34.397, 150.644); 
    var mapOptions = { 
    zoom: 8, 
    //centered on Carrollton, Texas -- Change lat,long values to change initial map area 
    center: 
    new google.maps.LatLng(32.999173, -96.897413) 
    } 
    //change Id reference to the div/container that contains the google map 
    map = new google.maps.Map(document.getElementById('map'), mapOptions); 
} 

function codeAddress() { 
    //Loop through and concate street and city values to find long,lat values for all fields 
    for (var cName = 0; cName < namearray.length; cName++){ 
    var address = streetarray[cName].value + cityarray[cName].value; 

    //start geocode copy & paste text from API reference 
    geocoder.geocode({ 'address': address}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     var results = results[0].geometry.location; 
     map.setCenter(results); 
     var marker = new google.maps.Marker({ 
      map: map, 
      position: results, 

     }); 
    //Push lng/lat locations to the mapArray 
    mapArray.push(results); 
    //Loop through mapArray to add Lat/Lng values, and then divide by j (number of locations) to find the average 
    for (var i in mapArray) { 
    var avgLat = 0; 
    var avgLng = 0; 
    var j = 0; 
    var avgLat = (avgLat + mapArray[i][1]); 
    var avgLng = (avgLng + mapArray[i][2]); 
    console.log(mapArray, avgLat, avgLng); 
    j++; 
} 

avgLat = avgLat/j; 
avgLng = avgLng/j; 


    var markerCircle = new google.maps.Circle({ 
     center: results, 
     radius: 15000, 
     strokeColor:"#0000FF", 
     strokeOpacity:0.8, 
     strokeWeight:2, 
     fillColor:"#0000FF", 
     fillOpacity:0.4 


    }) 
     markerCircle.setMap(map); 


    } else { 
     alert('Geocode was not successful for the following reason: ' + status); 
    } 
    }); 
}} 

ответ

1

2 вопрос:

  • results[0].geometry.location не является массив, это объект (а google.maps.LatLng). Используйте методы lat() и lng() получить широту и долготу
  • var avgLat = 0;
    var avgLng = 0;
    var j = 0;.

    Вы должны переместить это на внешнюю часть цикла, иначе переменные будут очищены в каждом цикле.

+0

Это имеет смысл! Я вообще не поймал проблему с петлей ..... спасибо! Один вопрос о результатах ... комментарий. Я создал новый массив, называемый mapArray, и подтолкнул значения результатов [0] .geometry.location к этому массиву, чтобы я мог пропустить их и вытащить lat() lng() таким образом; это лучший способ сделать это, или было бы лучше работать непосредственно с объектом результатов? –

+0

Вы не можете работать напрямую без помощника, потому что ответы поступают один за другим. Вместо дополнительного цикла вы можете сохранить 3 глобальных переменных для количества маркеров, суммы широты и суммы долготы. Обновляйте эти переменные каждый раз, когда вы получаете ответ, и вычисляете среднее значение на основе этих переменных, тогда вам не нужно циклически перебирать увеличивающийся массив каждый раз. –

+0

Спасибо вам обоим. –

Смежные вопросы