programing

mongodb 점이 다각형에 있는지 확인합니다.

newsource 2023. 7. 9. 11:13

mongodb 점이 다각형에 있는지 확인합니다.

mongo 2.6

저장된 다각형의 양이 어느 정도 있습니다.제 말도 일리가 있어요.이 점이 저장된 다각형에 적합한지 여부를 확인합니다.

문서 예제

{ ..., "polygons" : [ [ 17.60083012593064, 78.18557739257812 ], [ 17.16834652544664, 78.19381713867188 ], [ 17.17490690610013, 78.739013671875 ], [ 17.613919673106714, 78.73489379882812 ] ], ... }

이미 거의 같은 질문이 있습니다. Mongodb : 이 저장된 폴리곤 안에 있는지 확인합니다.그러나 이 쿼리는 적어도 하나의 결과(예를 들어)를 제공해야 하지만 그렇지 않습니다.

db.areas.find( { polygons : { $geoIntersects : { $geometry : {type:"Point",coordinates:[17.3734, 78.4738]} } } } )

사실 제가 다각형의 테두리에 있는 점을 선택했다면, 그렇습니다.

$geoWithin방법은 작업을 수행해야 합니다.mondodb문서에 나와 있습니다.

하지만 이러한 쿼리는 작동하지 않습니다.

db.areas.find( { polygons : { $geoWithin : { $geometry : {type:"Point",coordinates:[17.3734, 78.4738]} } } } ) - not supported with provided geometry

db.tradeareas.find( { polygons : { $geoWithin : { $geometry : {type:"Polygon",coordinates: inside_polygon} } } } ) - BadValue bad geo query

뭔가 놓친 것 같은데 무엇이 어디에 있는지 이해할 수가 없습니다.

도움을 주시면 감사하겠습니다.

그것은 주문과 관련이 있는 것 같습니다.사용 중인 경우$geoWithin다각형 안에서 점을 찾으려 할 때, 그 안에 있는 것은 검색 중인 필드입니다.하지만,$geoIntersects각 방향으로 작동하므로 다각형 내부 또는 점을 포함하는 다각형 내부의 점을 검색할 수 있습니다. 예:

db.geom.insert({
  "polygons": {
    "type":"Polygon",
    "coordinates": [[
      [ 17.60083012593064, 78.18557739257812],
      [ 17.16834652544664, 78.19381713867188],
      [ 17.17490690610013, 78.739013671875],
      [ 17.613919673106714, 78.73489379882812],
      [ 17.60083012593064, 78.18557739257812]
    ]]
  }
});

db.geom.find({
  polygons: {
    $geoIntersects: {
      $geometry: {
        "type": "Point",
        "coordinates": [17.3734, 78.4738]
      }
    }
  }
});

또한 다각형의 첫 번째 점을 끝에서 반복해야 합니다.마지막 쌍을 제거하면 다음과 같은 값을 얻을 수 있습니다.$err:

쿼리를 표준화할 수 없습니다. 잘못된 값 잘못된 지오쿼리" 오류입니다.

MongoDB는 유효하지 않은 지오메트리를 삽입할 수 있고 2dsphere 인덱스를 추가하거나 교차/내부/근접 쿼리를 수행할 때만 불만을 제기하는 것으로 보이는데, GeoJSON은 유효한 지오메트리가 아닌 유효한 JSON일 수 있기 때문에 합리적이라고 생각합니다.

John Powell에게 감사합니다. 여기 동일한 쿼리의 C# 드라이버 버전이 있습니다.

 var geometry = new BsonDocument
                            {
                                     { "type", "Point" },
                                     { "coordinates",
                                        new BsonArray(new double[]{ Longitude,
                                        Latitude} ) }
                            };
                    var geometryOperator = new BsonDocument { { "$geometry", geometry } };
                    var geoIntersectsOperator = new BsonDocument { { "$geoIntersects", geometryOperator } };

                    var findField = new BsonDocument { { "geometry", geoIntersectsOperator } };


                    var results = MyCollection.Find(findField).ToList();

Java에서는 이러한 방식으로 수행할 수 있습니다.

@Autowired
private MongoOperations mongoOpertions;
    
public void pointIntersect(GeoJsonPoint gp){
    Query query = new Query();
    query.addCriteria(Criteria.where("geometry").intersects(gp));
    List<ResultDtoType> result = mongoOpertions.find(query, ResultDtoType.class);
    //perform any action with result 
}

언급URL : https://stackoverflow.com/questions/24578363/mongodb-check-if-point-is-in-polygon