2015-05-11 2 views
0

У меня есть некоторые маркеры на картах Google, и я хотел бы идентифицировать кластеры между ними между двумя точками. Тем не менее, я имею немного трудности:Иерархическая кластеризация в JavaScript

Сначала я Переберите все фломастеры и создать массив, который является:

for (var i = 0; i < MARKERS.length - 1; i++) {  
for (var j = i + 1; j < MARKERS.length; j++) { 
var distance_between = google.maps.geometry.spherical.computeDistanceBetween(point_i, point_j) 
var valueToPush = {} 
valueToPush.fromMarker = name_i 
valueToPush.toMarker = name_j 
valueToPush.distance = distance_between 
cluster_array.push(valueToPush) 
} 
} 

Что бы я тогда хотел бы сделать, это запустить иерархический алгоритм кластеризации, как это :

var cluster = .cluster(cluster_array, MAX, threshold) 

Где, если я указываю 500 для порогового значения, то я получаю список как этот

кластера 0: Маркер, Маркер Y Маркер C

кластер 1: Маркер В

кластер 2: Маркер D, Е Маркер

т.д.

где каждый кластер показывает мне маркера, которые находятся в пределах 500 м друг от друга.

Большое спасибо

+0

чек [kmeans алгоритм] (http://en.wikipedia.org/wiki/K-means_clustering) и [алгоритм детерминированного отжига] (http://apiacoa.org/publications/teaching/deterministic-annealing/da-slides.pdf) для другого подхода –

ответ

0

Если это помогает, это то, что я в конечном итоге делает:

function the_clusterer(cluster_array, num_radius) { 
    console.log('Clustering distance array') 
    for (var i = 0; i < cluster_array.length - 1; i++) { 
     if (typeof(cluster_array[i]) != 'undefined') { 
      var size_outer = 0, 
       key_outer; 
      for (key_outer in cluster_array[i]) { 
       if (cluster_array[i].hasOwnProperty(key_outer)); 
       size_outer++; 
      } 
      for (var j = 0; j < size_outer; j++) { 
       for (var k = i + 1; k < cluster_array.length; k++) { 
        if (typeof(cluster_array[i]) != 'undefined') { 
         var size_inner = 0, 
          key_inner; 
         for (key_inner in cluster_array[k]) { 
          if (cluster_array[k].hasOwnProperty(key_inner)); 
          size_inner++; 
         } 
         var found_outer = 0 
         for (var l = 0; l < size_inner; l++) { 
          if (found_outer === 1) { 
           break; 
          } 
          if (cluster_array[k][l] == cluster_array[i][j]) { 
           found_outer++ 
          } 
         } 
         if (found_outer > 0) { 
          for (var l = 0; l < size_inner; l++) { 
           var found_inner = 0 
           for (var m = 0; m < size_outer; m++) { 
            if (cluster_array[i][m] == cluster_array[k][l]) { 
             found_inner++ 
            } 
           } 
           if (found_inner == 0) { 
            cluster_array[i][size_outer] = cluster_array[k][l] 
            size_outer++ 
           } 
          } 
          delete cluster_array[k]; 
         } 
        } 
       } 
      } 
     } 
    } 
    txtOutput.value += "Start Clusters: " + num_radius + "m.\n" 
    var k = 0 
    for (var i = 0; i < cluster_array.length - 1; i++) { 
     var size_outer = 0, 
      key_outer; 
     for (key_outer in cluster_array[i]) { 
      if (cluster_array[i].hasOwnProperty(key_outer)); 
      size_outer++; 
     } 
     if (size_outer > 0) { 
      k++ 
      var temp_line = "Cluster " + k + ":" 
      for (var j = 0; j < size_outer; j++) { 
       temp_line = temp_line + " Marker " + cluster_array[i][j] 
      } 
      txtOutput.value += temp_line + ".\n" 
     } 
    } 
} 
Смежные вопросы