2012-04-07 20 views
5

Google Javascript Maps API 3.5Lỗi bản đồ: Các điểm đánh dấu dịch chuyển khắp nơi khi chuyển đổi góc nhìn. Sửa chữa?

Vấn đề cơ bản là nếu bạn có điểm đánh dấu trên cột mốc cố định như vòi cứu hỏa ở chế độ xem trên cao, thì bạn chuyển sang chế độ xem 45 độ, điểm đánh dấu không còn hiển thị trên đầu của vòi. Và ngược lại (vị trí các điểm đánh dấu trong 45 độ xem sau đó chuyển sang trên không).

Để tái sản xuất:

Xem mẫu ở đây: www.zingjet.com/maptest.html

-Tạo một trang web của Google Maps cơ bản với một dấu hiệu kéo. Với vị trí đánh dấu/bản đồ ban đầu trên một khu vực có sẵn hình ảnh 45 độ: (thử: 33.501472920248354, -82.01948559679795). Tôi không chắc chắn nó cho thấy vấn đề này cho tất cả các khu vực vì vậy hãy thử điểm đó để bắt đầu.

-Hãy chắc chắn rằng bạn đã được phóng to gần tối đa và theo quan điểm của truyền hình vệ tinh

-Turn tắt hình ảnh 45 độ

Chức vụ đánh dấu trên điểm cố định (góc vỉa hè, nhà ống khói, vv)

thay đổi thành chế độ xem 45 độ.

-Lưu ý rằng vị trí đánh dấu được chuyển

-Cố xoay 45 độ và xem cách đánh dấu chuyển tương đối so với điểm gốc trên hình ảnh.

-Chuyển lại phí và điểm đánh dấu ở vị trí ban đầu.

Tại sao lại có vấn đề: Không biết nên tin tưởng điều gì. Chế độ xem nào hiển thị vị trí chính xác cho điểm đánh dấu đó? Không thể tạo trang web cho phép mọi người định vị điểm đánh dấu trong một chế độ xem và xem chúng trong một chế độ xem khác. Những mâu thuẫn lớn.

+1

Bạn có mẫu mã hay jsFiddle không? – hamczu

+0

mẫu là ở đây: www.zingjet.com/maptest.html – Fraggle

+0

Tôi nghĩ rằng nó có thể là một cái gì đó sai trái với bản đồ cụ thể này - nếu bạn đặt điểm đánh dấu trên bản đồ này từ [tài liệu] (https://google-developers.appspot.com/maps/documentation/javascript/examples/quay vòng trên không) mọi thứ hoạt động như mong đợi – hamczu

Trả lời

1

Điều bạn sẽ phải làm là tấn công nó. Theo như google có liên quan, có vẻ như không có lỗi và điểm trên bản đồ "xuất hiện" ở một vị trí khác vì chế độ xem 45 độ thay đổi quan điểm trên bản đồ và do đó khoảng thời gian dài rời rạc sẽ xuất hiện trên bản đồ (những thứ tương tự có thể xảy ra khi thay đổi zoom). Những gì bạn cần làm là tìm ra đồng bằng đó nằm giữa các khung nhìn và sau đó móc sự kiện "tilt_changed" và điều chỉnh điểm đánh dấu của bạn một cách thích hợp. Một cách tốt dễ học vùng đồng bằng là để níu kéo "dblclick" sự kiện để cảnh báo cho bạn những k.độ & v.độ chuột của bạn nằm trên:

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 :) 

và sau đó dblclick màn hình mà các điểm đánh dấu "nên" và tạo một hàm điều chỉnh điểm đánh dấu cho phù hợp. Về lý thuyết, bạn có thể xác định một hàm hoạt động trên mọi góc độ sao cho tất cả những gì bạn phải làm là vượt qua mọi vị trí của điểm đánh dấu thông qua hàm trên tilt_changed.Hãy cho tôi biết nếu điều này là một khởi đầu tốt cho bạn :)

+0

Hãy nhớ rằng tôi cần điều này để làm việc cho bất kỳ bản đồ nào và xử lý các chế độ xem xoay vòng (nhấp vào 45 độ, sau đó xoay bản đồ). Google thực sự nên xử lý việc này. Nếu bạn có toán để thay đổi điểm đánh dấu, hãy đăng bài. Cảm ơn. – Fraggle

3

CẬP NHẬT 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); 
       } 
      }); 
     } 

GHI CHÚ: đồng ở trên công việc như sau:

  1. Áp dụng lớp phủ tùy chỉnh để sử dụng; google.maps.MapCanvasProjection objectdoc
  2. Tìm vị trí bằng pixel của điểm đánh dấu;
  3. Thêm vào y (trên = lng) 45 độ (45 pixel ở độ phóng đại 20) cộng với 20 pixel chiều cao biểu tượng điểm đánh dấu (x luôn luôn không thay đổi vì độ thay đổi là ảo giác quang đơn giản;));
  4. Chuyển đổi vị trí pixel đó thành vị trí công cụ hợp lệ;
  5. quan sát thay đổi phương pháp tilt từ 0 đến 45 và ngược lại và hành động tương ứng bằng cách đặt tọa độ mới.
+0

Điều này khá tốt. Không hoạt động nếu tôi xoay chế độ xem ở chế độ 45 độ. Nhưng mang lại cho tôi một cái gì đó để làm việc với. Mặc dù giá trị 65 đó có thể thay đổi cho các vị trí bản đồ khác nhau, các điểm đánh dấu khác nhau, v.v. – Fraggle

Các vấn đề liên quan