2

Google マップ (API v3 Javascript) に描かれた複雑なポリゴンを単純化しようとしています。私の目標は、単純なポリゴンの配列を受け取ることです。問題は、私が描いた図形の一部は分析でき、一部は分析できなかったことです。

例えば:

1) Figure 8-vertical - 座標を持つ多角形 (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) Figure 8-horizo​​ntal - 座標を持つ多角形 (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);
}
4

2 に答える 2

0

クリッパー バージョン 6 は、ポイントがポリゴン ライン セグメント上にある (セグメントと交差していないが、接触している) 場合でも、StrictlySimpletrue に設定されている場合、真に単純なポリゴンを生成できます。私はまだこれをテストしていませんが、ここでアンガス・ジョンソンのコメントを参照します: https://sourceforge.net/p/polyclipping/discussion/1148419/thread/813a62c8/

以下は、そのようなポリゴンの例です。5 番目の点は垂直線分に接しています。この場合の単純化の結果は、2 つの三角形です。

ここに画像の説明を入力

Clipper 6 の JavaScript バージョンは、リリース直後ではなく、少し遅れてリリースされます。

于 2013-09-05T08:53:45.083 に答える
0

エレナ。

機能していません - SimplifyPolygon は同じ複雑なポリゴンを返します

「複雑なポリゴン」の意味がわかりませんが、自己交差ポリゴンを意味する場合 ( http://en.wikipedia.org/wiki/Complex_polygonを参照)、 SimplifyPolygon 関数は実際に自己を削除します・予想通りの交差点。あなたが得ているのは単一の単純な多角形ですが、前の交点で同じ座標に2つの頂点があります。

単純な多角形

ただし、本当に 2 つの個別のポリゴンが必要な場合は、ライブラリ内の基礎となるコードを変更する必要があります (ここでの説明を参照してください)。

于 2013-02-28T10:13:09.410 に答える