2016-10-24 14 views
1

이것은 프런트 엔드 측에 있습니다. 나는 turf.js을 사용하고 있습니다.Turf.js Polygon, MultiPolygon, GeometryCollection으로 교차 버퍼

시나리오 : 내 현재 위치에서 10km 이내에있는 모든 경고 및 인시던트를 가져옵니다.

많은 사람들이 geometry.type='Point' || geometry.type='MultiPolygon' || geometry.type='GeometryCollection'을 갖고있는 경고 또는 인시던트가 포함 된 geojson 피드가 생깁니다. 내가 지금까지했던 어떤

:

내 현재의 좌표 버퍼 기능 영역을 만들고 사고가 나 (10km) 근처에서 발생한 경우 비교.

geometry.type = 'Point'인 경우 turf.inside (point, bufferPolygon)를 사용하여 비교하고 있는데 정상적으로 작동합니다.

어려운 점은 MultiPolygon 또는 MultiPolygons가있는 GeometryCollection입니다.

양쪽 매개 변수에서 다각형을 사용할 수있는 유일한 방법은 turf.intersect(polygon, bufferPolygon)입니다.

여기에 피드에 geometry.type ='Polygon'이 표시되지 않지만 MultiPolygon 또는 GeometryCollection (멀티 폴리곤이 있음)입니다.

if(feature.geometry.type === 'Point') { 
    if(turf.inside(feature, bufferPolygon)) { 
     console.log("inside"); 
     feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++; 
    } 
} else { 
    if(feature.geometry.type === 'GeometryCollection') { 
     $.each(feature.geometry.geometries, function(index, geo) { 
      if(geo.type === 'MultiPolygon') { 
       //console.log('MP:', geo.coordinates[0]); 
       var convertToPolygon = turf.polygon(geo.coordinates[0]); 
       console.log('convertToPolygon:',convertToPolygon); 
       //console.log('MP:intersect',turf.intersect(polygon, bufferPolygon)); 
       var isIntersecting = turf.intersect(convertToPolygon, bufferPolygon); 
       if(isIntersecting) { 
        feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++; 
       } 
      } else if(geo.type === 'GeometryCollection') { 
       console.log('GC:', geo); 
      } 
     }); 
    } else { 
     console.log('not geo collection:', feature.geometry.type); 
    } 
} 

또한 멀티 폴리곤을 다각형으로 변환하려고 시도했지만 제대로 작동하지 않았습니다.

점, 다중 다각형 및 GeometryCollection을 가진 기능 모음 집합과 bufferFeature를 비교할 수있는 방법을 제안 해주십시오.

답변

1

버퍼를 여러 포인트와 비교해도 상관없는 일은 다각형/다중 다각형에 turf.explode()을 사용하는 것입니다. 다음은 문서 링크입니다.

http://turfjs.org/examples/turf-explode/

잔디 모양의 정점을 대표하는 포인트의 기능 모음으로 다각형 또는 다중 다각형을 켜집니다 폭발. 폴리곤/다중 다각형 위에 turf.explode()을 실행했으면 결과의 각 지형지 물 (점)을 반복하고 turf.inside()을 사용하여 버퍼와 비교해야합니다. 이 부분에 turf.within()을 사용하는 것이 더 쉬울 수도 있지만, 원할 경우 turf.inside()을 대신 사용할 수 있습니다.

점 중 하나가 버퍼 안에 있으면 점이 나타내는 다각형의 적어도 일부가 버퍼 영역에도 있었기 때문에 작동합니다.

또 다른 방법은 거리를 비교하는 버퍼 대신 점을 사용하는 것입니다. 그렇다면 점이 있다면 turf.distance()과 두 점 사이의 거리를 볼 수 있습니다. 다각형/다중 다각형이있는 경우 turf.explode() 수 있으며 원래 지점과의 거리를 비교하십시오.

지오메트리 컬렉션의 경우 지오메트리 컬렉션의 여러 부분을 유형별로 별도의 지형지 물 모음으로 분리하지 않으면 잔디를 사용하는 사람들과 함께 작업 할 수 있다고 생각하지 않습니다.

0

또한 멀티 폴리곤을 다각형으로 변환하려고 시도했지만 작동하지 않았습니다. .

왜 작동하지 않습니까? 더 설명해 주시겠습니까?

다중 다각형 또는 다각형은 점 집합입니다. 점의 배열이나 점의 기능을 포함하는 배열로 변환 할 수 있어야합니다.

당신은 이런 식으로 뭔가를 할 수 :

function unpackMultiPolCoords(features) { 
    var data = []; 
    featureEach(features, function(feature) { 
    var coordCollection = feature.geometry.coordinates; 
    coordCollection.forEach(function(coords) { 
     coords.forEach(function(coord) { 
     data.push(coord); 
     }); 
    }); 
    }); 
    return data; 
}; 

var unpacked = unpackMultiPolCoords(multiPoly); 

let toPoints = function(fc) { 
    let points = []; 
    fc.forEach((coord) => { 
    points.push(turf.point(coord)); 
    }); 
    return points; 
}; 

var points = toPoints(unpacked); 

그런 다음 당신이 당신의 버퍼에 turfs 거리 기능을 가진 모든 지점을 비교할 수 http://codepen.io/bitHugger/pen/mOxwME

@ 전체 코드를 참조하십시오.