Я программист-любитель и работаю над проектом, который я имею в виду, используя 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);
}
});
}}
Это имеет смысл! Я вообще не поймал проблему с петлей ..... спасибо! Один вопрос о результатах ... комментарий. Я создал новый массив, называемый mapArray, и подтолкнул значения результатов [0] .geometry.location к этому массиву, чтобы я мог пропустить их и вытащить lat() lng() таким образом; это лучший способ сделать это, или было бы лучше работать непосредственно с объектом результатов? –
Вы не можете работать напрямую без помощника, потому что ответы поступают один за другим. Вместо дополнительного цикла вы можете сохранить 3 глобальных переменных для количества маркеров, суммы широты и суммы долготы. Обновляйте эти переменные каждый раз, когда вы получаете ответ, и вычисляете среднее значение на основе этих переменных, тогда вам не нужно циклически перебирать увеличивающийся массив каждый раз. –
Спасибо вам обоим. –