2013-02-28 40 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版本不释放后立即到来,但一些延迟之内。