2012-04-07 10 views
5

Google Javascript Maps API 3.5Błąd mapy: Znaczniki zmieniają się w dowolnym miejscu podczas zmiany kątów widzenia. Naprawić?

Podstawową kwestią jest to, że jeśli masz znacznik, który jest na stałym punkt orientacyjny jak hydrantu w widoku z góry, a następnie przełączyć się na 45-stopniowy widok, marker nie wskazuje na szczycie hydrantu. I odwrotnie (umieść znacznik w widoku 45 stopni, a następnie przełącz na nadmiar).

Aby odtworzyć:

See próbka tutaj: www.zingjet.com/maptest.html

-Tworzenie podstawowym Google Maps strona internetowa z Draggable markera. Z początkową pozycją znacznika/mapy na obszarze z dostępnymi zdjęciami 45 stopni: (spróbuj: 33.501472920248354, -82.01948559679795). Nie jestem pewien, czy pokazuje to problem dla wszystkich obszarów, więc spróbuj tego punktu, aby rozpocząć.

-make pewno duże w pobliżu max iw świetle Satellite

-Skręć off 45 stopni obrazowania

pozycji a markerem nad stałym punktem (róg chodniku, dom komina, etc)

- Zamień na widok 45 stopni.

-Note tej pozycji markera jest przesunięty

-Try obrót 45 stopni i zobacz jak znacznik przesuwa się względem pierwotnego punktu na obrazie.

-Przełącz z powrotem na obciążenie i marker znajduje się w oryginalnym miejscu.

Dlaczego to jest problem?: Nie wiem, komu można zaufać. Jaki widok pokazuje dokładną pozycję tego znacznika? Nie można tworzyć stron internetowych, które umożliwiają umieszczanie znaczników w jednym widoku i wyświetlanie ich w innym. Poważne niespójności.

+1

Masz próbkę kodu lub jsFiddle? – hamczu

+0

próbka jest tutaj: www.zingjet.com/maptest.html – Fraggle

+0

Myślę, że to może być coś nie tak z tą konkretną mapą - jeśli umieścisz znacznik na tej mapie z [documentation] (https://google-developers.appspot.com/maps/documentation/javascript/examples/aerial-rotation) wszystko działa zgodnie z oczekiwaniami. – hamczu

Odpowiedz

1

To, co najprawdopodobniej będziesz musiał zrobić, to zhakować. Jeśli chodzi o google, prawdopodobnie nie ma błędu, a punkt na mapie "pojawia się" w innym miejscu, ponieważ widok 45 stopni zmienia perspektywę na mapie, a tym samym, w jaki sposób dyskretny długometraż fizycznie pojawi się na mapie (podobne rzeczy mogą się zdarzyć, gdy zoom się zmieni). To, co musisz zrobić, to dowiedzieć się, co to jest delta między widokami, a następnie zahaczyć o zdarzenie "tilt_changed" i odpowiednio dostosować swój znacznik. Jeden dobry łatwy sposób nauczyć delta jest spinanie „dblclick” zdarzenie ostrzega ciebie długość i szerokość geograficzną myszkę jest:

google.maps.event.addDomListener(map, 'dblclick', function(MouseEvent){ 
     alert(MouseEvent.latLng.lat()+" "+MouseEvent.latLng.lng()); 
    }); 
// make sure you disable the maps default zoom on double click 
//or choose a different event or it will get annoying :) 

a następnie dblclick ekran gdzie marker „powinno być” i utworzyć funkcję który odpowiednio dostosowuje marker. Teoretycznie możesz zdefiniować funkcję działającą pod dowolnym kątem, więc wszystko, co musisz zrobić, to przekazanie każdej pozycji markera przez funkcję na tilt_changed.Daj mi znać, jeśli jest to dobry początek dla ciebie :)

+0

Pamiętaj, że potrzebuję tego do pracy na dowolnej mapie i do obsługi obróconych widoków (kliknij na 45 stopni, następnie obróć mapę). Google naprawdę powinna sobie z tym poradzić. Jeśli masz matematykę, aby zmienić znaczniki, opublikuj. Dzięki. – Fraggle

3

Updated 2

 var map, marker, overlay, latlng, zoom = 20; 
     function initialize() { 
      latlng = new google.maps.LatLng(33.501472920248354, -82.01948559679795); 
      var myOptions = { 
       zoom : zoom, 
       center : latlng, 
       tilt : 0, 
       mapTypeId : google.maps.MapTypeId.SATELLITE 
      } 
      map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
      overlay = new google.maps.OverlayView(); 
      overlay.draw = function() { 
      }; 
      overlay.onRemove = function() { 
      }; 
      overlay.setMap(map); 
      marker = new google.maps.Marker({ 
       position : latlng, 
       map : map, 
       draggable : true, 
       title : "Hello World!" 
      }); 

      google.maps.event.addListener(map, 'zoom_changed', function() { 
       zoom = map.getZoom(); 
      }); 

      google.maps.event.addListener(map, 'dragend', function() { 
       overlay.setMap(map); 
      }); 

      google.maps.event.addListener(marker, 'dragend', function(evt) { 
       var tilt = map.getTilt(); 
       latlng = new google.maps.LatLng(evt.latLng.lat(), evt.latLng.lng()); 
       if(tilt === 45) { 
        var projection = overlay.getProjection(); 
        var latlng2pixel = projection.fromLatLngToContainerPixel(marker.getPosition()); 

        var delta = 0; 
        switch(zoom) { 
         case 20: 
          delta = 45; 
          break; 
         case 19: 
          delta = 12; 
          break; 
         case 18: 
          delta = 4; 
          break; 
        } 
        latlng = projection.fromContainerPixelToLatLng(new google.maps.Point(latlng2pixel.x, (latlng2pixel.y + delta))); 
       } 
      }); 

      google.maps.event.addListener(map, 'tilt_changed', function() { 
       var tilt = map.getTilt(); 
       if(tilt === 45) { 
        var delta = 0; 
        switch(zoom) { 
         case 20: 
          delta = 65; 
          break; 
         case 19: 
          delta = 32; 
          break; 
         case 18: 
          delta = 16; 
          break; 
        } 
        var projection = overlay.getProjection(); 
        var latlng2pixel = projection.fromLatLngToContainerPixel(marker.getPosition()); 
        var pixel2latlng = projection.fromContainerPixelToLatLng(new google.maps.Point(latlng2pixel.x, (latlng2pixel.y - delta))); 
        marker.setPosition(pixel2latlng); 
       } else { 
        marker.setPosition(latlng); 
       } 
      }); 
     } 

UWAGI: co de powyższe czynności są następujące:

  1. Zastosuj niestandardową nakładkę do użycia; google.maps.MapCanvasProjection objectdoc
  2. Znajdź pozycję w pikselu znacznika;
  3. Dodaj do y (góra = lng) 45 stopni (45 pikseli przy powiększeniu 20) plus 20 piksel wysokości ikony znacznika (x pozostają zawsze niezmienione, ponieważ zmiana stopni jest prostym złudzeniem;));
  4. Konwersja tych pozycji pikseli do prawidłowej pozycji latlng;
  5. obserwuj zmianę metody tilt z 0 na 45 i viceversa i odpowiednio postępuj, ustawiając nowe współrzędne.
+0

To całkiem nieźle. Nie działa, jeśli obracam widok w trybie 45 stopni. Ale daje mi coś do pracy. Chociaż ta wartość 65 może się zmienić dla różnych lokalizacji na mapie, różnych znaczników itp. – Fraggle

Powiązane problemy