2014-01-21 84 views
0

我正在創建一個隨機分佈的點密度圖來表示每個縣的人口。現在,我正在做的是取一個縣的最大經度和緯度值,在它們之間挑選兩個隨機數,並測試概述該縣的多邊形的邊界以查看它是否落入其中。如果確實如此,我將它添加到地圖中,如果沒有,我會返回並重試。這會運行數千次,所以錯過確實會影響加載時間。我真的很想找出一種方法來繪製範圍內,而不是選擇一個隨機點,測試它,然後繪製它。我甚至沒有完全理解我的測試算法是如何工作的,因爲我借用了this awesome answer的代碼,所以在這一點上我已經超出了我的頭腦,但我認爲這可能對你們中的一些人來說是一個有趣的挑戰。有沒有辦法優化這個Google Map點密度圖算法?

這裏是我使用的代碼:

function addMarkers() { 
     var loc = "Resources/Counties.json"; 

     $.getJSON(loc, function (data) { 
      $.each(data.features, function (key, val) { 

       var xArray = []; // 
       var yArray = []; // 

       var coords = []; 
       var latlng; 
       var bounds = new google.maps.LatLngBounds(); 
       var polygon; 

       $.each(val.geometry.coordinates[0], function (i, item) { 
        latlng = new google.maps.LatLng(item[1], item[0]); 
        xArray.push(item[0]); // 
        yArray.push(item[1]); // 
        coords.push(latlng); 
        bounds.extend(latlng); 
       }); 

       var nverts = xArray.length; // 
       var maxX = Math.max.apply(null, xArray); // 
       var maxY = Math.max.apply(null, yArray); // 
       var minX = Math.min.apply(null, xArray); // 
       var minY = Math.min.apply(null, yArray); // 

       polygon = new google.maps.Polygon({ 
        paths: coords, 
        strokeColor: "#000000", 
        strokeOpacity: 1, 
        strokeWeight: 01, 
        fillColor: "#cccccc", 
        fillOpacity: .5 
       }); 

       polygon.setMap(map); 

       var i = 1; 
       while(i < populations[val.properties.Name]/10000){ 
        var testX = Math.random() * (maxX - minX) + minX; // 
        var testY = Math.random() * (maxY - minY) + minY; // 

        if(pnpoly(nverts, xArray, yArray, testX, testY) == 1){ // 
         var mlatlng = new google.maps.LatLng(testY, testX); // 
         var marker = new google.maps.Marker({ position: mlatlng, icon: "Resources/dot.png", map: map }); // 
         i++; 
        } 
       } 
      }); 
     }); 

    function pnpoly(nvert, vertx, verty, testx, testy) 
    { 
     var i, j, c = 0; 
     for (i = 0, j = nvert-1; i < nvert; j = i++) 
     { 
      if (((verty[i]>testy) != (verty[j]>testy)) && 
      (testx < (vertx[j]-vertx[i]) * (testy-verty[i])/(verty[j]-verty[i]) + vertx[i])) 
      { 
      c = !c; 
      } 
     } 
     return c; 
    } 
+0

有一個[google.maps.Polygon 「containsLocation(點:經緯度,多邊形:多邊形)」 功能(https://developers.google.com/ maps/documentation/javascript/reference#poly)放在「幾何」庫中。 – geocodezip

+0

謝謝,我開始使用它來代替pnpoly(),但是我真的在尋找一些能夠幫助我避免創建隨機點並完全針對多邊形進行測試的東西。 – philthyfool

回答

0

我所做的是創建一個彩色地圖(顏色是獨一無二的,從功能指數衍生​​)的功能檢驗隨機(BBOX約束)座標下。我知道座標是否在顏色映射中的顏色內。該測試是一個O(1)操作,其中您發佈的代碼是O(n)。我的中國縣點密度圖表現很好。我開始與這傢伙的代碼示例:

https://gist.github.com/awoodruff/94dc6fc7038eba690f43