我怎样才能结合多边形并删除重叠? [英] How can I combine polygons and remove the overlap?

查看:153
本文介绍了我怎样才能结合多边形并删除重叠?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Google地图中编辑了多边形,现在我可以更改形状,在其中打洞,将两个多边形组合成多多边形并再次分解它们。



请参阅 http://maps.amsterdam.nl / testshape / beheer 并阅读Legenda中的说明以自行尝试。



我无法弄清的一个问题是如何组合两个重叠的多边形到一个没有重叠的多边形。
类似于这样:

$ p $ function(path1,path2){
algorithm ...
返回newPath;
}

谢谢。

解决方案

非常感谢lib建议。我使用了 https://github.com/bjornharrtell/jsts/blob/master /examples/overlay.html

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

可以组合形状并在形状中打孔或剪裁形状。
因此,我必须将Google Maps路径转换为WKT,并且我写了这个Javascript:
$ b

  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 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 [i] == 1)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 (阅读说明中的说明)


I made polygons editable in Google Maps and now I can change the shape, make holes in it, combine two of more polygons to multipolygons and disaggregate them again.

See http://maps.amsterdam.nl/testshape/beheer and read the Instructions in the Legenda to try it yourself.

One question I can't figure out is how to combine two overlapping polygons to one polygon with no overlap. Something like this:

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

Thank you.

解决方案

Thanks a lot for the lib suggestion. I used https://github.com/bjornharrtell/jsts/blob/master/examples/overlay.html with:

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

to combine shapes and to make holes in shapes or to clip shapes. Therefor I had to convert the Google Maps paths to WKT and I wrote this 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;
}

You can try/see everthing working in http://maps.amsterdam.nl/testshape/beheer (read Instructions in the Legend)

这篇关于我怎样才能结合多边形并删除重叠?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆