2016-07-26 1 views
0

OpenLayers3 ol.interaction.Draw을 사용하여 정점을 클릭하거나 자유형 다각형을 그리려면 Shift + Drag로지도에 도형을 그릴 수 있습니다. 내 응용 프로그램에). 일단 모양이 그려지면 turf.js를 사용하여 그려진 모양을 클라이언트의 WFS 레이어와 비교하여 intersect()을 실행하여 WFS 기능이 그려진 모양과 교차하는지 확인합니다. 그러나 손으로 그린 ​​모양에 약간의 자체 교차점이있는 경우 turf.js intersect() 함수가 실패하여 다음 오류가 발생합니다 (줄 326은 intersect()이라고합니다).turf.js OpenLayers3에서 자체 교차 폴리곤에 대한 교차 오류 Draw

turf.min.js 9 catch되지 [개체 개체]
getResultGeometry @ turf.min.js 9
si.overlayOp turf.min.js @ 9
교차 @ turf.min. JS : turf.min.js @ 15
e.exports : 16
(익명 함수) main.js @ 326

따릅니다 내 코드의 스케치입니다.

var features = new ol.Collection(); 

var vs = new ol.source.Vector({ 
    format: new ol.format.GeoJSON(), 
    url: function(extent) { 
    return XXXXXX; 
    }, 
    strategy: ol.loadingstrategy.bbox 
}); 

features.on('add', function() { 
    vs.forEachFeatureIntersectingExtent(extent, function(feature) { 
    // use to turf.js to intersect each feature with drawn feature 
    var bt = gjformat.writeFeatureObject(feature, {rightHanded: false}); 
    var dt = gjformat.writeFeatureObject(features.item(0), {rightHanded: false}); 

    var intersection = turf.intersect(bt, dt); 
    } 
}); 

나는 아무 소용이 모두 turf.js simplify()ol.geom.Geometry.simplify()를 사용하는 것을 시도했다. 누구든지 손으로 그린 ​​자기 교차 폴리곤을 처리하기 위해 turf.js intersect()을 얻으려는 제안이 있습니까? 또는 교차로를 실행하기 전에 자기 교차로를 제거하는 방법?

답변

0

Using JSTS buffer to identify a self-intersecting polygon에 대한 답변 (@ahocevar의 감사)에서 turf.js로 이식되었습니다. 0으로 자체 교차점을 사용하여 그려진 형상을 버퍼링하면 더 작은 자체 교차 된 폴리곤이 제거되고 intersect()을 실행하기위한 깨끗한 특성이 유지됩니다.

features.on('add', function() { 
     vs.forEachFeatureIntersectingExtent(extent, function(feature) { 
     // create geojson of wfs features and drawn feature 
     var bt = gjformat.writeFeatureObject(feature, {rightHanded: false}); 
     var dt = gjformat.writeFeatureObject(features.item(0), {rightHanded: false}); 

     // check for kinks in the drawn feature 
     var kinks = turf.kinks(dt); 
     var dtf; 

     if(kinks.features.length > 0) { 
      // if there are self-intersections, buffer by 0 to get rid of them 
      dtf = turf.buffer(dt, 0, 'meters'); 
     } else { 
      // if there are no self-intersection, intersect by unbuffered features 
      dtf = dt; 
     } 

     var intersection = turf.intersect(bt, dtf); 
     } 
    }); 
0

적어도 사용자에게 교차로에 대해 경고 할 수 있습니다. JSTS로 감지 할 수 있습니다. Google Maps Polygons self intersecting detection을 참조하십시오. 자체 교차점 제거는 어렵지만 JSTS에서도 가능해야합니다 : Using JSTS buffer to identify a self-intersecting polygon.

+0

Turfjs는 방법이있다 [꼬임() (http://turfjs.org/docs/#kinks) 자기 교차점을 검출하므로 I가 또 다른 라이브러리로 이동하지 않아도 자기 교차 폴리곤을 버퍼링하는 방법을 살펴 보겠습니다. –