2013-02-28 189 views
2

我試圖簡化在Google地圖(API v3 Javascript)上繪製的複雜多邊形。我的目標是獲得一組簡單的多邊形。問題是可以分析我繪製的一些數字,其中一些數據不能。簡化多邊形 - Clipper庫Angus Johnson

例如:

1)圖8垂直 - 對於多邊形(VAR areaPolygon)座標:

{42.15093256154524, 24.746017456054687} 
{42.149087174176515, 24.740352630615234} 
{42.14049586965896, 24.754257202148437} 
{42.1333673840616, 24.747648239135742} 
{42.13795007405907, 24.73846435546875} 
{42.145841707270215, 24.74867820739746} 
{42.15093256154524, 24.749107360839843} 
{42.15093256154524, 24.746017456054687} 

它的正常工作 - 在SimplifyPolygon返回2個簡單多邊形

2)圖8水平 - 對於多邊形(VAR areaPolygon)座標:

{42.145523515284395, 24.744129180908203} 
{42.15016895950386, 24.749279022216797} 
{42.14603262169405, 24.7646427154541} 
{42.14978715502878, 24.769277572631836} 
{42.15055076167604, 24.758892059326172} 
{42.14393253136682, 24.75193977355957} 
{42.141705086714666, 24.747648239135742} 
{42.14348704870535, 24.74472999572754} 
{42.145523515284395, 24.744129180908203} 
  • 它不工作 - 在SimplifyPolygon返回相同的複雜多邊形

這裏是我的代碼:

function analyzePolygon(areaPolygon) { 

//areaPolygon is google.maps.Polygon 
var subj_polygon = new ClipperLib.Polygon(); 
var result_polygons = new ClipperLib.Polygons(); 

//LatLng coordinates to integer coordinates 
for(var i = 0; i < areaPolygon.getPath().getArray().length ; i++) { 
    subj_polygon.push(new ClipperLib.IntPoint(Math.round(areaPolygon.getPath().getArray()[i].lat()*100000000000000), Math.round(areaPolygon.getPath().getArray()[i].lng()*100000000000000))); 
} 

var cpr = new ClipperLib.Clipper(); 

result_polygons = cpr.SimplifyPolygon(subj_polygon, ClipperLib.PolyFillType.pftNonZero); 

//for each simple polygon - make a request and populate markers of the objects which are in these bounds 
for(var j=0; j < result_polygons.length; j++) { 

    var rpStringify = JSON.stringify(eval(result_polygons[j])); 
    var rpJSON = JSON.parse(rpStringify); 
    var arrayPolygon = []; 
    for (var i = 0; i < rpJSON.length; i++) { 

     var tempObject = JSON.stringify(eval(rpJSON[i])); 
     var objectJSON = JSON.parse(tempObject); 
     var tempArr = [2]; 
     tempArr[0] = objectJSON.X/100000000000000; 
     tempArr[1] = objectJSON.Y/100000000000000; 
     arrayPolygon[i]= tempArr; 
    } 

    loadPinsPolygon(arrayPolygon); 
} 

回答

0

埃琳娜。

它不工作 - 在SimplifyPolygon返回同樣複雜的多邊形

我不知道你所說的「複雜多邊形」的意思,但如果你說的是自交的多邊形(見http://en.wikipedia.org/wiki/Complex_polygon ),那麼SimplifyPolygon函數確實會按預期移除自交。你得到的是一個簡單的多邊形,儘管有兩個頂點在前一個交點處的相同座標。

simple polygon

但是,如果你真的想兩個分立的多邊形,那麼你就需要修改底層代碼庫(見討論here。)

+0

謝謝@昂格斯約翰遜! – Elena 2013-04-15 15:20:29

0

剪版本6可以產生真正簡單的多邊形也如果點在多邊形線段上(不跨越線段但觸摸它),如果StrictlySimple設置爲true。我還沒有測試過,但我參考了Angus Johnson的評論: https://sourceforge.net/p/polyclipping/discussion/1148419/thread/813a62c8/

下面是這種多邊形的一個例子。第五點是觸摸垂直線段。在這種情況下簡化的結果是兩個三角形。

enter image description here

快船6 JavaScript版本不釋放後立即到來,但一些延遲之內。