2013-02-24 38 views
4

我在Google Maps中製作了可編輯的多邊形,現在我可以改變形狀,在其中打洞,將多個多邊形中的兩個多邊形合併爲多​​面體並再次分解它們。如何組合多邊形並刪除重疊?

請參閱http://maps.amsterdam.nl/testshape/beheer並閱讀Legenda中的說明自行試用。

我無法弄清楚的一個問題是如何將兩個重疊的多邊形合併到一個沒有重疊的多邊形。 事情是這樣的:

function(path1, path2) { 
    algorithm... 
    return newPath; 
} 

謝謝。

+1

我會使用一個lib對於這對夫婦是 http://gis.stackexchange.com/questions/7159/pure-javascript-library-for-geometry-operations – 2013-02-24 15:34:44

回答

1

非常感謝lib的建議。我用https://github.com/bjornharrtell/jsts/blob/master/examples/overlay.html有:

var union = a.union(b); 
var difference = a.difference(b); 

結合形狀,使孔的形狀或夾形狀。爲此 我不得不穀歌地圖的路徑轉換爲WKT和我寫此Javascript:

function doeWKT(dePaths) { 
var deWKTarray = [];  
for (var i = 0; i < dePaths.length; i++) { 
    dePath = dePaths.getArray()[i].getArray(); 
    var deKomma = ""; 
    var deCoords = ""; 
    for (var j = 0; j < dePath.length; j++) { 
     deLatLng = dePath[j]; 
     if (j == 0) var deCoords0 = deKomma + deLatLng.lng().toFixed(6) + " " + deLatLng.lat().toFixed(6); 
     deCoords += deKomma + deLatLng.lng().toFixed(6) + " " + deLatLng.lat().toFixed(6); 
     deKomma = ","; 
    } 
    deWKTarray.push("(" + deCoords + "," + deCoords0 + ")"); 
} 

var deHoles = []; 
var deReader = new jsts.io.WKTReader();  
for (var i = 0; i < deWKTarray.length; i++) { 
    var deHole = deReader.read("POLYGON("+deWKTarray[i]+")"); 
    if (!deHoles[i]) deHoles[i] = -1; 
    for (var j =0; j < deWKTarray.length; j++) { 
     if (i != j) { 
      var deContainer = deReader.read("POLYGON(" + deWKTarray[j] + ")"); 
      if (deHole.within(deContainer)) deHoles[i] = j; 
     } 
    } 
} 

var deKomma = ""; 
var deWKTstring = ""; 
var deMulti = false; 
for (var i = 0; i < deWKTarray.length; i++) { 
    if (deHoles[i] == -1) { 
     deWKTstring += deKomma + "(" + deWKTarray[i] + ""; 
     if (i > 0) var deMulti = true; 
    } 
    for (var j = 0; j < deHoles.length; j++) { 
     if (deHoles[j] == i) deWKTstring += "," + deWKTarray[j] + ""; 
    } 
    if (deHoles[i] == -1) deWKTstring += ")"; 
    deKomma = ","; 
} 

if (deMulti) deWKTstring = "MULTIPOLYGON(" + deWKTstring +")"; 
else deWKTstring = "POLYGON" + deWKTstring; 
return deWKTstring; 
} 

你可以試試/看到寄託都在http://maps.amsterdam.nl/testshape/beheer工作(讀圖例說明)

+1

您帖子底部的鏈接已損壞(404未找到)。這個例子仍然可用嗎? – preyz 2014-02-25 22:52:18