2013-04-15 21 views
5

Tôi đang vẽ vài trăm nghìn điểm qua MarkerClustererPlus và tôi muốn đặt nhóm biểu tượng cụm (màu) dựa trên một số thuộc tính bên ngoài (không dựa trên số lượng đánh dấu được đại diện). Cách duy nhất tôi có thể nghĩ để làm điều này là tạo ra nhiều đối tượng MarkerClusterer và đi qua một đối tượng khác nhau options, nhưng tôi cảm thấy như tôi sẽ thực hiện một hit hiệu suất lớn làm điều đó. Có cách nào tốt hơn?MarkerClustererPlus: đặt màu biểu tượng/url độc lập với kích thước

Marker Clusterer Plus with differently sized icons scaled to fit.

Với hình trên, tôi muốn 139, 24 tuổi, và 5 là màu vàng và 213, 25, 30, và 2 để có màu đỏ; và nếu có thể, cập nhật phong cách của họ/options qua setOptions:
mc.group[0].setOptions({"url": imgPath +lookupThreshold(severity)+ '.svg' });
mc.group[1].setOptions({"url": imgPath +lookupThreshold(severity)+ '.svg' });

T.B. Nếu có ai quan tâm, tôi tinh chỉnh các lib nên biểu tượng cụm quy mô kích thước của nó bằng cách cung cấp một hình ảnh svg và tăng chiều rộng & chiều cao trong các tùy chọn đối tượng:

var mcOptions = { 
    "styles": [{ 
    "height": 19, 
    "url": img/map/clusters/", 
    "width": 19 
    },{ 
    "height": 24, 
    "url": img/map/clusters/", 
    "width": 24 
    }, {…}] 
}; 
for (var s = mcOptions.styles.length-1; s >= 0; s--) 
{ mcOptions.styles[s].url += lookupThreshold(severity) + '.svg'; } 
// lookupThreshold switches severity and returns a string: red, orange, … 

Sau đó, thêm dòng sau vào markerclusterer.js:

line 275: this.backgroundSize_ = style.backgroundSize || "contain"; 
line 300: style.push('background-size:' + this.backgroundSize_ + ';'); 

trình trong FFX 19.0.2, Chrome 26.x, Chrome Canary 28.x, Safari 6.0.2, IE 9.0.8 (nhưng không phải Opera 12.15).

CHỈNH SỬA Dường như không có nhiều hiệu quả trong việc tạo ra nhiều phiên bản của MarkerClusterer; tuy nhiên, dường như đối tượng thuộc tính/tùy chọn được chuyển đến MC là được chia sẻ trong trường hợp các MC.

Giải Quyết tôi đã phải sửa đổi các thư viện MarkerClustererPlus gần đường 665 để sao chép opt_options (lib đã sử dụng một tài liệu tham khảo, khiến tất cả opt_options trước được ghi đè bằng mới nhất/cuối cùng một thông qua).

+0

Bạn đã kiểm tra liên kết này chưa? http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/examples/advanced_example.html – Fabi

+0

@Fabi, vâng. Lý do các cụm là các cụm khác nhau là vì chúng có kích thước khác nhau. Tôi muốn tất cả các kích cỡ của một nhóm cụm cụ thể có cùng màu (nhưng có kích thước khác nhau); các nhóm khác nhau nên có màu sắc khác nhau. – jacob

+0

Hiện tại, tôi không thể thấy một giải pháp khác ngoài những gì bạn có - nhiều trường hợp vì chúng là các nhóm khác nhau. – Fabi

Trả lời

2

Vì vậy, nó quay ra những rắc rối đến từ các MarkerClustererPlus lib bản thân:

656: function MarkerClusterer(map, opt_markers, opt_options) { 
… 
665: opt_options = opt_options || {}; 

Dòng tạo ra một tài liệu tham khảo đến đối tượng hiện có, thay vì một bản sao mới. Tôi không thể sử dụng MarkerClusterer.prototype.extend từ dòng vì nó không tạo bản sao sâu (và nó chỉ mở rộng nguyên mẫu của đối tượng).

Vì vậy, tôi đã viết riêng chức năng của tôi sâu bản sao (jsfiddle), mà tôi đã thực hiện toàn cầu có sẵn (chứ không phải thêm nó vào nguyên mẫu của cả hai MảngObject):

function deepCopy(obj) { 
    this.cloneArr = function (arr) { 
    var newArr = []; 
    for (var i = arr.length-1; i >= 0; i--) newArr[i] = this.evalObj(arr[i]); 
    return newArr; 
    }; 
    this.cloneObj = function(obj) { 
    var newObj = {}; 
    for (var prop in obj) newObj[prop] = this.evalObj(obj[prop]); 
    return newObj; 
    }; 
    this.evalObj = function(obj) { 
    switch (typeof obj) { 
     case 'object': 
     if (Array.isArray(obj)) return this.cloneArr(obj); 
     if (obj instanceof Date === false) return this.cloneObj(obj); 
     // pass thru dates, strings, numbers, booleans, and functions 
     default: return obj; // primitive 
    } 
    }; 
    return this.evalObj(obj); 
} 

tôi sau đó thay đổi MarkerClustererPlus.js như sau:

656: function MarkerClusterer(map, opt_markers, opt_optionsG) { 
… 
665: var opt_options = deepCopy(opt_optionsG) || {}; 

tôi thử nghiệm có 5 trường hợp của MarkerClustererPlus (mỗi với 5000 đánh dấu, tổng 25000), và không có tác động hiệu quả decernable so với việc có một MC + trường hợp duy nhất.

Screenshot of multiple instances of MarkerClustererPlus

+0

Rất hữu ích, nơi để thêm chức năng deepCopy? Và làm thế nào là mã chi tiết của bạn trong html để thay đổi màu sắc? Cảm ơn bạn – Orz

+0

Theo câu trả lời của tôi, tôi đặt nó "toàn cầu" (gắn liền với 'cửa sổ'). Màu của các điểm đánh dấu được điều khiển bởi SVG được cung cấp trong thuộc tính 'url'. – jacob

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