Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法优化这个谷歌地图点密度地图算法?_Javascript_Algorithm_Google Maps - Fatal编程技术网

Javascript 有没有办法优化这个谷歌地图点密度地图算法?

Javascript 有没有办法优化这个谷歌地图点密度地图算法?,javascript,algorithm,google-maps,Javascript,Algorithm,Google Maps,我正在创建一个随机分布的点密度图来表示每个县的人口。现在,基本上我所做的是获取一个县的最大纬度和经度值,在它们之间选择两个随机数,然后根据勾勒该县轮廓的多边形的边界进行测试,看看它是否在其中。如果有,我会将其添加到地图中,如果没有,我会返回并重试。这会运行数千次,因此未命中的情况确实会影响加载时间。我真的很想找出一种在边界内绘制的方法,而不是选择一个随机点,测试它,然后绘制它。我甚至不完全理解我的测试算法是如何工作的,因为我借用了我的代码,所以我在这一点上有些不知所措,但我认为这对你们中的一些人

我正在创建一个随机分布的点密度图来表示每个县的人口。现在,基本上我所做的是获取一个县的最大纬度和经度值,在它们之间选择两个随机数,然后根据勾勒该县轮廓的多边形的边界进行测试,看看它是否在其中。如果有,我会将其添加到地图中,如果没有,我会返回并重试。这会运行数千次,因此未命中的情况确实会影响加载时间。我真的很想找出一种在边界内绘制的方法,而不是选择一个随机点,测试它,然后绘制它。我甚至不完全理解我的测试算法是如何工作的,因为我借用了我的代码,所以我在这一点上有些不知所措,但我认为这对你们中的一些人来说可能是一个有趣的挑战

以下是我正在使用的代码:

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;
    }
函数addMarkers(){
var loc=“Resources/countries.json”;
$.getJSON(loc,函数(数据){
$.each(数据、特征、功能(键、值){
var xArray=[]//
var-yArray=[]//
var-coords=[];
var latlng;
var bounds=new google.maps.LatLngBounds();
var多边形;
$.each(val.geometry.coordinates[0],函数(i,项){
latlng=new google.maps.latlng(项目[1],项目[0]);
xArray.push(项目[0])//
yArray.push(第[1]项)//
协调推进(latlng);
边界扩展(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)//
多边形=新的google.maps.polygon({
路径:坐标,
strokeColor:#000000“,
频闪不透明度:1,
冲程重量:01,
填充颜色:“#中交”,
填充不透明度:.5
});
多边形.setMap(map);
var i=1;
而(itesty)!=(verty[j]>testy))&&
(testx<(vertx[j]-vertx[i])*(testy-verty[i])/(verty[j]-verty[i])+vertx[i]))
{
c=!c;
}
}
返回c;
}

我所做的是创建一个功能的颜色映射(颜色是唯一的,并从功能索引中派生),以测试随机(bbox约束)坐标。我通过颜色映射中的颜色知道坐标是否在功能内。此测试是一个O(1)操作,其中您发布的代码是O(n).我的中国县点密度图表现良好。我从这家伙的代码示例开始:


在“几何体”库中有一个。谢谢,我确实开始使用它而不是pnpoly(),但是我确实在寻找一些可以帮助我避免创建随机点并针对多边形进行测试的东西。