基於turf在多邊形內隨機生成點

實現思路:1)獲取多邊形矩形框範圍,2)在多邊形矩形框範圍內隨機生成一個任意點;3)判斷生成的點是否在多邊形面內,如果在則結束,否則,重複2 3步驟,支到判斷點在多邊形面內爲真結束。

//獲取樓多邊形的範圍
    var bounds = JSON.parse(selects[1].options[selects[1].selectedIndex].getAttribute("data-bounds"));
    console.log(bounds);
    //適配範圍格式
    var arr = [];
    for (var i = 0; i < bounds.length; i++) {
        console.log(bounds[i]);
        arr.push(bounds[i]);
    }
    console.log(bounds[0]);
    //首尾座標串應該一致
    arr.push(bounds[0]);
    var polygon1 = new AMap.Polygon({
        bubble: true,
        fillOpacity: 0.4,
        strokeWeight: 1,
        path: bounds,
        map: map,
        strokeColor: "#0000ff",
        fillColor: "#0000ff"
    });
    //獲取樓的矩形範圍
    var sz = polygon1.getBounds(); 
    console.log(sz)
    var sw = sz.getSouthWest();
    var ne = sz.getNorthEast();
    var minlng = sw.lng;
    var minlat = sw.lat;
    var maxlng = ne.lng;
    var maxlat = ne.lat; 		

    //隨機生成一個矩形範圍內的點;
    var points = turf.randomPoint(1, { bbox: [minlng, minlat, maxlng, maxlat] });
    console.log(points);
    var coordinates = points.features[0].geometry.coordinates;
    console.log(coordinates)
    var point = turf.point([coordinates[0], coordinates[1]]);
    console.log(point)
    //樓的多邊形
    var py = turf.polygon([arr]);
    console.log(py)
    //判斷生成的隨機點是否在面內
    var ptsIn = turf.booleanPointInPolygon(point, py);
    console.log(ptsIn);
    //判斷隨機生成的點是否在面內,如果不在繼續生成隨機點並判斷。
    //循環次數
    var count = 0;
    while (!ptsIn) {
        points = turf.randomPoint(1, { bbox: [minlng, minlat, maxlng, maxlat] });
        console.log(points);
        coordinates = points.features[0].geometry.coordinates;
        point = turf.point([coordinates[0], coordinates[1]]);
        ptsIn = turf.booleanWithin(point, py);
        console.log(ptsIn);  
        count++;
    }
    console.log(count);
    var pos = new AMap.LngLat(coordinates[0], coordinates[1]);
    var marker = new AMap.Marker({ map: map, position: pos });

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章