odczyt współrzędnych google map

0

Witam wszystkich

w kodzie JS, w pętli ustawionej przez PHP, odczytuje współrzędne długości i szerokości geograficznej, wg. podanego adresu z tablicy PHP:

<script type="text/javascript">
    $(function(){        
        $("#btnid").click(function() {
            var geocoder = new google.maps.Geocoder();
            var counter = 0;
            var key;
            var addr;
            var latitude;
            var longitude; 
            var myArray= new Array();
                   
    
            <?php foreach ($phpArray as $key => $value) : ?>                    
                    key = <?php echo $value["id"] ?>;
                    addr    = '<?php echo $value["address"] ?>';                    

                    latitude = 0;
                    longitude = 0;                                        
                    geocoder.geocode({'address': addr}, function (results, status) {
                        if (status == google.maps.GeocoderStatus.OK) {
                            latitude = results[0].geometry.location.lat();
                            longitude = results[0].geometry.location.lng();                                                       
                           console.log(latitude+'  '+longitude);

                           setMyPositions();                          
                        } else {
                            //alert("Geocoder failed due to: " + status); 
                        }                        
                    });                            
                    
                    var setMyPositions= function(){        
                        myArray[counter] = {
                             "id" : key,
                             "lng" : longitude,
                             "lat" : latitude,
                        };                                                        
                    }            
                     
                    counter++;        
            <?php endforeach; ?>
            
        
            if (myArray.length > 0) {
                    $.ajax({
                        type: "POST",
                        url: 'adres url',
                        data: {'arr': myArray}, 
                        dataType: "text",
                        complete: function (data) {
                        },
                        error: function (data) {
                        }
                    });        
            }      
        });    
    });    
    //-->
</script>

Jednak nie działa poprawnie... nie widzie parametrów longitude oraz latitude

0

... już sobie jakoś poradziłem, jednak mam kłopot, ponieważ dane odczytywane są w pętli, w skutek czego niedługo po uruchomieniu skryptu otrzymuje w Firebug info "OVER_QUERY_LIMIT"

Oczywiście dla testów wstawiając alert(), widać w konsoli Firebug, że odczytuje wszystkie współrzędne.

Pytanie brzmi jakim najlepiej sposobem otrzymać programowo to samo co za pomocą *alert *???

0

alert zatrzymuje Ci działanie javascriptu i oczekuje na zamknięcie.

OVER_QUERY_LIMIT oznacza, że robisz zbyt szybko zapytania do map (wystarczyło sobie w Google wpisać).

Zrób pętlę przy użyciu setInterval i zrób wymagany odstęp (nie wiem jaki jest dla mapek - poszukaj w manualu)

0

OK, poradziłem sobie.

Nasuwa się kolejne pytanie z optymalizacją, mam około 1000 wierszy w bazie z adresami, gdy w skrypcie odczytuję współrzędne długości i szerokości geograficznej wg. adresu, to przy około 300 wyświetleń zaczyna strasznie zamulać.

Ustawiłem sobie czas startowy 100ms, gdy jest status OVER_QUERY_LIMIT zwiększam interwał czasowy - czas jest resetowany do 100ms po odczytaniu współrzędnych.

Reasumując po ponad 300 iteracjach widzę, że przy OVER_QUERY_LIMIT zajmuje mu to prawie 700ms - czasami ma 500ms. Czy jest to możliwe że po prostu tyle mu to zajmuje, odczytanie danych z google map ?

0

Optymalizacja to by była wtedy, gdybyś sobie te wyniki cache-ował [po stronie serwera] ;) wątpię, że Google się cieszy, że każdy odwiedzający będzie chciał do JEDNEGO odwiedzenia strony z mapką wykonać 1000 zapytań. Na początku pozwala zapytania wykonywać szybko, żeby można ich było faktycznie wykonać kilkanaście (zapewne się przydaje czasem) na raz, ale im bardziej atakujesz zapytaniami - tym bardziej się bronią.

Edit: Poszukaj sobie może jakie masz limity zapytań?

0

Czy składnia podania adresu w google maps, jest dowolna ? Tzn. jeśli jest np. Lodz, Polna 2B albo Polna 2B Lodz ma to jakies znaczenie

0

I tak, i nie.
Google takie rzeczy poprawia, a słuszny format Ci podpowiada podczas pracy z Google Maps (podejrzewam, że przez ich API da się pobrać adres w tym właśnie poprawionym formacie): http://i.imgur.com/GhNFioA.png

Może to mieć znaczenie tylko w przypadku np. gdy w jakimś mieście XXX byłaby ulica o nazwie YYY, a istniałoby też miasto YYY z ulicą o nazwie XXX (sytuacja raczej poza granicami polski, odmiana tutaj wyklucza taki przypadek)

Edit: Twój przykład w sumie lepszy: http://i.imgur.com/zpYsDx5.png bo ukazuje, że Google ma także sugestie dot. małych miejscowości obok - takie sugestie są przydatne gdy szukamy miejscowości, których jest kilka(naście) o tej samej nazwie - oraz ukazuje problem, że czasem "Jakaś_nazwa_miejscowości" nie da poprawnego wyniku

0

Witam ponownie

aby nie rozpoczynać nowego wątku, podczepię pod aktualny następujący temat :

"poszukuję rozwiązania w google map, aby otrzymać drogę w metrach, pomiędzy punktami". Posiadam przykładowe dane z długości i szerokości geograficznej oraz czasu. Teoretycznie w ten sposób mógłbym otrzymać info o prędkości.
Mapy google umożliwiają wytyczenie tras, albo w lini prostej - dla człowieka, albo wskazując drogę - dla samochodów; tylko potrzeba to oprogramować... Są też takie możliwości jak wybór trasy (najdłuższa, średnia, krótka), czy istnieje taki moduł ?

Byłbym wdzięczny za wszelkie dane ...

0

dokumentacja, wszystko tam jest ;) ja ani z v3 nie korzystałem, a nawet gdyby v2 było aktualnie dostępne i na topie - to i tak musiałbym szukać, bo na pamięć nie znam -> więc równie dobrze możesz poszukać sam ;)

0

Słuchajcie, mam pytanie do technologii JavaScript. Poniżej jest prosta funkcja która z podanych wartości dl i szer geogr. uzyskuje adres :

var addr = [];

function my_addr(sLat, sLong) {
    geo = new google.maps.Geocoder();              
    latlng = new google.maps.LatLng(sLat, sLong);
    
    geo.geocode({'latLng':latlng},function(data,status) {         
        if(status == google.maps.GeocoderStatus.OK) {         
             addr = data[1].formatted_address;                       
console.log(addr);             
            for(var i=0; i<data[1].address_components.length; i++) {                             
                if(data[1].address_components[i].types[0] == "administrative_area_level_1"){             
                    addr = addr + ' - ' + data[1].address_components[i].short_name;     
                }         
            }    
        }            
    })    
}

Jest to funkcja w funkcji, chcę wyciągnąć ten adres na zewnątrz, przypisać do zmiennej globalnej. Jak to uzyskać ...
0

nie wyciągniesz tego tak, żeby wstawić "pod geo.geocode" ponieważ jest to callback - funkcja geo.geocode wykonuje się niezależnie, a kod leci dalej, dopiero gdy przyjdzie odpowiedź to jest wykonywana ta funkcja bez nazwy. nie możesz wewnątrz tej anonimowej funkcji wrzucić odwołania do jakiejś swojej funkcji?

0

Próbowałem odnieść się do innej funkcji z tej powyżej, przekazując parametr do zewn., gdzie przypisywałem do zmiennej globalnej. Niestety dalej nic ....

0

zmienne globalne to zło, szczególnie w przypadku zapytań asynchronicznych.
nie wiem jak Ci wytłumaczyć - więc może po prostu MOCNO I DUŻO poczytaj o callbackach w javascript

0

Bardzo dziękuję za wszystkie podpowiedzi. Została mi ostatnia z 'pluginem' PHP - GeoIP.

Widząc, że ktoś wchodzi na stronę z domeną pl z Tokio (współrzędne gograficzne się zgadzają - sprawdzałem), to mam w to wierzyć, czy też mam przypuszczać, że to jakieś odbicie z serwera, który się tam znajduje.

Roboty google, wyłączyłem w .htaccess

0

Może być proxy, mogą być inne boty, mogą być Polacy w Tokio, albo może być błędna geolokalizacja po IP (to, że się współrzędne z geoIP zgadzają co do kraju, także podanego z geoIP - to nie ma co sprawdzać :p)

0

... więc podsumowując GeoIP w tym sensie jest od czapy, bo może być cokolwiek i nikt nigdy nie będzie pewny jaka jest prawda, czy to rzeczywiście ktoś z Tokio czy proxy i inne cuda

0

Nie wiem czy jakakolwiek geolokalizacja jest 100% wiarygodna. Nawet pobrane dane z GPS urządzenia użytkownika mogą być sfałszowane ;) [a geolokalizacja po IP to akurat bardzo słaba geolokalizacja - jeszcze kraj jako tako, ale miasto na pewno nie, bo np. neostrada - użytkownicy ze zmniennym łączem przydzielani w obszarze np. Łodzi - wszyscy w promieniu 100km od Łodzi (dla przykładu) będą oznaczeni jako Łódź]

0

Nie wiem czy sprawdzał ktoś kiedyś API JavaScript Google Map, ponieważ mam prosty przykład z Firebuga :

distance
    Object { text="9,9 km", value=9865}
text
    "9,9 km"
value
    9865
duration
    Object { text="17 min", value=1026}
text
    "17 min"
value
    1026
status
    "OK"

Chcąc się dowiedzieć ile sekund ma 17 min robimy prosty przelicznik, sprawdzamy i patrzymy, porównujemy z 'value' jest różnica - chyba, że to nie sekundy value=1026 (powinno być 1020)

Skąd ta różnica, podobnie jest gdy wybierzemy typ :

travelMode: google.maps.TravelMode.DRIVING,
avoidHighways: true,

czyli omijamy autostrady - wpisując ręcznie współ, w google map, także zobaczymy różnicę... ????

0

Sekundy są dokładniejsze niż minuty po prostu.
1026 / 60 = 17,1 czyli 17 minut i 6 sekund, czyli po zaokrągleniu 17 minut.

1 użytkowników online, w tym zalogowanych: 0, gości: 1