programing

PHP / MongogeoJSON 루프가 잘못되었습니다.

megabox 2023. 6. 23. 21:51
반응형

PHP / MongogeoJSON 루프가 잘못되었습니다.

저는 지리 검색을 위해 몽고에 좌표를 전달하고 있습니다.좌표가 교차하지 않는 경우(예: 그림 8) 작동합니다.하지만 두 개의 선이 교차할 때, 그것은 다음을 줍니다.loop is not valid교차로를 찾아서 이 모든 루프를 분할할 방법이 없을까요?

많을 수 있습니다.

편집: 샘플 쿼리 및 오류를 추가했습니다.왜 그런 일이 일어나는지 이해합니다. 저는 단지 그 루프를 별도의 폴리곤(일부 알고리즘 또는 Mongo 내)으로 분할할 수 있는 알려진 방법이 있는지 궁금합니다.

쿼리:

db.items.find({
    "address.location": {
        "$geoWithin": {
            "$geometry": {
                "type": "Polygon",
                "coordinates": [[
                    [-97.209091, 49.905691],
                    [-97.206345, 49.918072],
                    [-97.178879, 49.919399],
                    [-97.165146, 49.907903],
                    [-97.164459, 49.892865],
                    [-97.180939, 49.889326],
                    [-97.197418, 49.895077],
                    [-97.200165, 49.902596],
                    [-97.203598, 49.919399],
                    [-97.216644, 49.928682],
                    [-97.244797, 49.927356],
                    [-97.255096, 49.913209],
                    [-97.209091, 49.905691]
                ]]
            }
        }
    }
});

오류:

Error: error: {
    "waitedMS" : NumberLong(0),
    "ok" : 0,
    "errmsg" : "Loop is not valid: [
            [ -97.209091, 49.905691 ]
            [ -97.206345, 49.918072 ],
            [ -97.17887899999999, 49.919399 ],
            [ -97.16514599999999, 49.907903 ],
            [ -97.16445899999999, 49.892865 ],
            [ -97.180939, 49.889326 ],
            [ -97.197418, 49.895077 ],
            [ -97.200165, 49.902596 ],
            [ -97.203598, 49.919399 ],
            [ -97.216644, 49.928682 ],
            [ -97.24479700000001, 49.927356 ],
            [ -97.25509599999999, 49.913209 ],
            [ -97.209091, 49.905691 ]
        ]
        Edges 1 and 7 cross.
        Edge locations in degrees: [-97.2063450, 49.9180720]-[-97.1788790, 49.9193990]
        and [-97.2001650, 49.9025960]-[-97.2035980, 49.9193990]
    ",
    "code" : 2
}

갱신하다

저는 폭력적인 접근의 이미지를 추가했습니다.

폴리곤 슬라이싱

  • 기본적으로 교차로 앞을 내다보는 것입니다.
  • 하나를 찾으면 점을 교환하여 루프 내에 유지합니다.
  • 일부 대기열에서 절단을 "시작점"으로 추가합니다.
  • 앞을 돌아보고 자신의 출발점을 찾을 때 우리는 루프를 갖게 됩니다.
  • 그런 다음 "시작점" 대기열이 비워질 때까지 계속 진행합니다.
  • 새 다각형 집합에는 (이론적으로) 모든 개별 루프가 포함되어야 합니다.

하지만 이것에는 몇 가지 문제가 있습니다. 이 모든 루프를 통해 비용이 많이 들 수 있습니다.최대 50점이 약 1275개의 작업이라고 가정합니다.

또한 0/180도 좌표에 대한 랩어라운드를 처리하는 것은 어려울 수 있습니다.

어쨌든, 저는 이 일에 하루 종일 시간을 들이고 싶지 않았습니다. 저는 심지어 랩어라운드 조건을 다루지 않는 해결책도 다룰 수 있었습니다.

이것에 대한 좋은 알고리즘이 이미 어딘가에 있기를 바랍니다. (아마도 멋진 기술 용어를 가지고 있을 것입니다.)

또한 무차별 대입보다 더 효율적인 접근법이 있다면 좋을 것입니다.

좌표가 동일하기 때문에 다각형 모양에 이상이 발생합니다. [-97.1788790, 49.9193990] 및 [-97.2035980, 49.9193990].코드에서 중복 좌표를 제거하거나 변경합니다.

"coordinates": [[
    [-97.209091, 49.905691],
    [-97.206345, 49.918072],
    [-97.178879, 49.919399], // this line
    [-97.165146, 49.907903],
    [-97.164459, 49.892865],
    [-97.180939, 49.889326],
    [-97.197418, 49.895077],
    [-97.200165, 49.902596],
    [-97.203598, 49.919399], // and this one
    [-97.216644, 49.928682],
    [-97.244797, 49.927356],
    [-97.255096, 49.913209],
    [-97.209091, 49.905691]
]]

코멘트에서 언급했듯이 공간 데이터를 쿼리하는 더 나은 도구는 포스트를 사용하는 것입니다.GIS.

예를 들어 PostGIS에는 폴리곤의 문제를 찾기 위한 ST_validReason()과 해결할 st_makevalid가 있지만 이것이 옵션이 아니라면 PHP 스크립트에서 사용할 수 있는 서비스를 만들 것입니다.shapely파이썬 라이브러리 https://github.com/Toblerity/Shapely

http://toblerity.org/shapely/manual.html

Shapely의 첫 번째 전제는 Python 프로그래머가 RDBMS 외부에서 PostGIS 유형의 지오메트리 작업을 수행할 수 있어야 한다는 것입니다.

입니다.shapely 사용되는이며, 경험이 gis.stackexchange.com 에 수 .

저는 당신이 해결하려는 문제가 말처럼 사소하지 않다고 생각합니다.

따라서 다음 단계를 수행합니다.

1 모양 있게 하는 방법 찾기

유사한 질문: 자체 교차 폴리곤을 분할하면 파이썬에서 모양이 좋은 폴리곤이 하나만 반환됩니다.

2 python 스크립트에 쿼리 세부 정보를 전달하는 간단한 php 서비스를 만듭니다.

3 Shapely는 잘못된 폴리곤을 생성하는 것을 방지하지 않지만, 예외는 작동할 때 발생합니다.따라서 기본적으로 그러한 예외에 대해서는 1단계부터 스크립트를 호출합니다.

만약 이것이 단지 하나의 쿼리에 대한 것이라면, 저는 QGIS 소프트웨어(CSV로 점을 가져오고, (폴리곤 유형의) 새로운 모양 파일 레이어를 만들고, 숫자 정점 편집 플러그인을 사용)를 사용할 것입니다.

갱신하다

폴리곤을 만든 도구에 의해 고정되어야 한다고 생각하기 때문에 이 경우에는 사용자여야 합니다.다른 각도에서 보면 문제를 해결할 수 있으며, 사용자의 모양이 사용자의 것이고 앱의 Google Map에 그려진 경우 그리기 도중 교차가 발생하지 않을 수 있습니다.

또한 이 다각형 그리기(점 정렬 및 교차점 없는 다각형 만들기)도 발견되었습니다.

언급URL : https://stackoverflow.com/questions/38880927/php-mongo-geojson-loop-is-not-valid

반응형