2012-11-05 27 views
11

Với API Google Maps (v3), tôi đã tạo một loại bản đồ tùy chỉnh cho thế giới trò chơi hư cấu. Theo mặc định, bản đồ, ngay cả các loại bản đồ tùy chỉnh, lặp lại theo chiều ngang (xem hình ảnh bên dưới).Loại bản đồ tùy chỉnh: lặp lại bản đồ và điểm đánh dấu. Làm thế nào để thêm đệm vào bản đồ?


enter image description here Larger Image here


Có thể giữ bản đồ từ lặp đi lặp lại theo chiều ngang? Đối với bản đồ của tôi, nó không đại diện cho một hành tinh hay thế giới hình cầu, vì vậy việc lặp lại nó mãi mãi không có ý nghĩa gì cả. Tôi đã tìm ra cách để đơn giản là không tải gạch cho các bản đồ lặp đi lặp lại ở bên trái và bên phải như vậy:

enter image description here Larger Image here


Tuy nhiên, khi bạn tạo dấu này, dấu hiệu vẫn còn hiển thị cho tất cả các bản đồ lặp đi lặp lại:

enter image description here Larger Image here

có thể giữ t anh ta đánh dấu lặp đi lặp lại? Hoặc có thể giữ bản đồ lặp lại không? Bằng cách đó tôi không phải đối phó với các dấu hiệu lặp đi lặp lại?


làm việc xung quanh: Giới hạn Xoay ngoài Map Bounds Tôi đã đọc nhiều công việc ở quanh đó thảo luận đơn giản là hạn chế thế nào đến nay người dùng có thể pan sang trái hoặc phải. Điều này sẽ không hiệu quả đối với tôi vì tôi phải cho phép người dùng phóng to hết cỡ và xem toàn bộ bản đồ cùng một lúc. Nếu họ phóng to hết cỡ, các điểm đánh dấu lặp lại vẫn hiển thị, điều này là không thể chấp nhận được.


Có thể thêm một nhóm đệm vào bản đồ không? Bằng cách đó có một số lượng lớn các khoảng trống giữa các bản đồ:

enter image description here Larger Image here

Nếu tôi đã có thể để thêm đủ đệm, sau đó hạn chế panning sẽ làm việc cho tôi, bởi vì bất kỳ dấu hiệu lặp đi lặp lại có thể được đẩy đủ xa bởi phần đệm mà người dùng sẽ không bao giờ thấy chúng.


Cuối cùng mã của tôi, khá đơn giản:

(lưu ý: những hình ảnh ngói đồ tôi đang sử dụng không có sẵn trực tuyến chưa)

<!DOCTYPE html> 
<html style='height: 100%'> 
    <head> 
     <link rel="stylesheet" type="text/css" href="normalize.css" /> 
     <style> 
      html, body { height: 100%;} 
      #map_canvas { height: 1000px;} 
     </style> 


    </head> 
    <body style='height: 100%'> 
     <div id="map_canvas"></div> 

     <script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script> 
     <script type='text/javascript'> 

      var options = 
      { 
       getTileUrl: function(coord, zoom) 
       { 
        // Don't load tiles for repeated maps 
        var tileRange = 1 << zoom; 
        if (coord.y < 0 || coord.y >= tileRange || coord.x < 0 || coord.x >= tileRange) 
         return null; 

        // Load the tile for the requested coordinate 
        var file = 'images/zoom' + zoom + '/tile_' + zoom + '_' + (coord.x) + '_' + (coord.y) + '.jpg'; 

        return file; 
       }, 
       tileSize: new google.maps.Size(256, 256), 
       minZoom: 1, 
       maxZoom: 9, 
       radius: 1738000, // I got this from an example in the api, I have no idea what this does 
       name: 'Map', 
      }; 

      var mapOptions = 
      { 
       center: new google.maps.LatLng(0,0), 
       zoom: 2, 
       backgroundColor: '#000', 
       streetViewControl: false, 
       mapTypeControl: false 
      }; 

      var map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions); 
      var mapType = new google.maps.ImageMapType(options); 
      map.mapTypes.set('map', mapType); 
      map.setMapTypeId('map'); 

      var marker = new google.maps.Marker({ 
        position: new google.maps.LatLng(0,0), 
        map: map, 
        title: "Test" 
      }); 

      </script> 
    </body> 
</html> 
+0

tại đây: [Bản đồ google động với ô tùy chỉnh ngăn chặn lặp lại pan] (http://stackoverflow.com/questions/12825040/dynamic-google-map-with-custom-tiles-prevent-repeating-pan) – RASG

+0

@RASG chỉ giải quyết giới hạn panning. Vẫn cần đệm ở hai bên bản đồ. –

+0

Xin lỗi, sắp sửa đóng cửa này như một sự lừa gạt nhưng sau đó nhận ra nó không phải là. Cảm thấy tự do để áp dụng lại tiền thưởng. – casperOne

Trả lời

1

Trông với tôi như bạn chỉ cần thay đổi giới hạn zoom bắt đầu và giới hạn zoom tối thiểu của bạn.

Thậm chí google chạy lặp lại khi bạn ở mức thu phóng 1, nhưng nó không cho phép bạn thu nhỏ thấp hơn mức đó.

Chỉ thêm thuộc tính minZoom và maxZoom vào đối tượng tùy chọn của bạn để giới hạn thu phóng.

+0

Điều đó không giải quyết được sự cố. Nếu bạn thu nhỏ đủ xa để thấy toàn bộ bản đồ, thì bạn có thể thấy các điểm đánh dấu lặp lại. Nếu tôi không muốn cho phép người dùng xem toàn bộ bản đồ cùng một lúc thì đây sẽ là một tùy chọn, nhưng rất tiếc là không. –

+0

Bạn có bao giờ thử thêm điểm đánh dấu vào bản đồ google và thu nhỏ đến cấp 1 không? Bạn có thể thấy nó lặp lại. Bạn đang cố gắng giải quyết một vấn đề nan giải. – Adam

0

Bạn có thể thử đặt mặt nạ lên vùng lặp lại nhưng không thử. Điều này có vẻ như nó có thể giải quyết vấn đề của bạn: Apply mask to Google Map. Cập nhật: Chỉ áp dụng mặt nạ khi bạn cần, ví dụ: khi thu phóng thấp nhất. Tôi không nghĩ thay đổi kích thước cửa sổ trình duyệt sẽ ảnh hưởng đến bất kỳ thứ gì trên bản đồ. Nó cũng không liên quan gì đến câu hỏi và vấn đề là nếu mặt nạ nằm trên đỉnh của điểm đánh dấu. Cập nhật 2: Có vẻ như có thể với v2 nhưng không phải với v3. Trong v2, bạn có thể tắt các bản sao nằm ngang trong lớp chiếu: Google Maps API v3 with custom map image - markers repeating horizontally.

+0

Khi bạn phóng to, mặt nạ sẽ che phủ các phần của bản đồ mà bạn muốn xem không? Và làm thế nào mặt nạ sẽ hoạt động khi bạn thay đổi kích thước cửa sổ trình duyệt của bạn? –

+0

Tôi đã cập nhật câu trả lời của mình. – Bytemain

+0

Nếu bạn xoay bản đồ xung quanh, mặt nạ sẽ phải theo bản đồ bằng cách nào đó sẽ không? –

3

Trả lời cho câu hỏi: Có thể giữ các điểm đánh dấu lặp lại không?

Có.

Từ JavaScript của Google Maps API V3 Reference (3.19), nếu bạn đặt markerOptions tài sản tối ưu hóa để sai cho điểm đánh dấu của bạn, nó không lặp lại nhưng chỉ hiển thị trên bản đồ trung tâm.

Xem: https://developers.google.com/maps/documentation/javascript/reference#MarkerOptions

Vì vậy, trong mã của bạn, tôi sẽ sửa đổi var marker như vậy (thêm tối ưu hóa: false):

var marker = new google.maps.Marker({ position: new google.maps.LatLng(0,0), map: map, title: "Test" optimized: false });

Theo tài liệu của Google (I đã thêm bolding),

Tối ưu hóa lại nders nhiều đánh dấu là một phần tử tĩnh đơn. Tối ưu hóa hiển thị là được bật theo mặc định. Tắt hiển thị được tối ưu hóa cho GIF động hoặc PNG hoặc khi mỗi điểm đánh dấu phải được hiển thị dưới dạng phần tử DOM riêng biệt (chỉ sử dụng nâng cao).

Tôi đặt tối ưu thành false và sau đó xem qua trang để tìm id (hoặc ít nhất lớp) được liên kết với điểm đánh dấu của tôi. Tôi sẽ làm cho các dấu "thêm" không hiển thị. Nó chỉ ra các yếu tố có nhưng không có id hoặc lớp. Cũng giống như tôi đang suy ngẫm những cách khác để nhận dạng chúng bằng jQuery, tôi tình cờ nhìn vào "bản đồ" của tôi và nhận ra rằng các dấu "phụ" đã biến mất! ☺

Một lời cảnh cáo: dựa trên tài liệu của Google, tôi nghi ngờ hành vi này (dấu "thêm" không hiển thị) có thể là "tính năng không mong muốn".

Chúc mừng, Bruce.

+0

Có phải tùy chọn cho các đối tượng khác như polylines và đa giác không? – cadmy

0

Đối với những người vẫn gặp sự cố này, hãy xem giải pháp của tôi.

1- Thiết lập bản đồ phóng to (2) và thêm các vị trí đánh dấu (lat, dài) tức là

var minZoomLevel = 2; 
    map.setZoom(minZoomLevel); 

    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0; i < result.length; i++){ 
     var latlng = new google.maps.LatLng(result[i].Lat, result[i].Lng); 
     bounds.extend(latlng); 
    }); 

2- Đính kèm một người biết lắng nghe sự kiện trên zoom thay đổi tức là

google.maps.event.addListener(map, 'zoom_changed', function() { 
     if (map.getZoom() < minZoomLevel) map.setZoom(minZoomLevel); 
    }); 

3- Đính kèm một người nghe thay đổi trung tâm (Điều này thực hiện các trick) i.e

google.maps.event.addListener(map, 'center_changed', function() 
{ 
    checkBounds(bounds); 
} 

function checkBounds(allowedBounds) { 
    if(allowedBounds.contains(map.getCenter())) { 
     return; 
    } 
    var mapCenter = map.getCenter(); 
    var X = mapCenter.lng(); 
    var Y = mapCenter.lat(); 

    var AmaxX = allowedBounds.getNorthEast().lng(); 
    var AmaxY = allowedBounds.getNorthEast().lat(); 
    var AminX = allowedBounds.getSouthWest().lng(); 
    var AminY = allowedBounds.getSouthWest().lat(); 

    if (X < AminX) {X = AminX;} 
    if (X > AmaxX) {X = AmaxX;} 
    if (Y < AminY) {Y = AminY;} 
    if (Y > AmaxY) {Y = AmaxY;} 

    map.setCenter(new google.maps.LatLng(Y,X)); 
} 

Mỗi khi bạn thay đổi trung tâm, nó sẽ kiểm tra điểm của bạn và hạn chế ánh xạ tới một khu vực nhất định. Cài đặt thu phóng sẽ chỉ hiển thị một ô xếp thế giới và kiểm tra giới hạn sẽ giới hạn cuộn ngang!

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