2017-09-27 15 views
1

MongoDB를 사용하여 지형 공간 웹 앱을 만들고 있습니다. 다른 카테고리 (COUNTRY, STATE 등)가 포함 된 컬렉션에 많은 폴리곤이 있고 어떤 것이 STATE인지 COUNTRY인지 알고 싶지만 경우에 따라 이웃의 테두리 인 COUNTRYSTATE 그래서 교차로를 질의 할 때 나는 2 개국을 얻는다.다각형 오버랩 비율

주와 양국의 중복 비율을 계산하여 어느 것이 부모인지 파악하고 싶습니다. 나는 찾고 있었지만 이런 종류의 작업으로 어떤 라이브러리도 찾지 못했고 이러한 종류의 알고리즘을 수행하는 것은 좋지 않습니다.


편집 :

func findParent(state *GeoEntity) GeoEntity{ 
    session, err := mgo.Dial("localhost") 
    check(err) 
    defer session.Close() 

    entities := session.DB("geo").C("entity") 

    query := bson.M{ 
     "geometry": bson.M{ 
      "$geoIntersects": bson.M{ 
       "$geometry": state.Geometry, 
      }, 
     }, 
     "type": "COUNTRY", 
    } 

    var countries []GeoEntity 
    err = entities.Find(query).All(&countries) 
    check(err) 

    var parent GeoEntity 

    if len(countries) > 1 { 
     //TODO: parent = findTheTrueParent(countries, state) 
    } else { 
     parent = countries[0] 
    } 

    return parent 
} 
: 내가 지금있는이 내가

type GeoEntity struct { 
    ID  bson.ObjectId `json:"id" bson:"_id"` 
    Type  string  `json:"type" bson:"type"` // COUNTRY, STATE, etc. 
    Geometry Geometry  `json:"geometry" bson:"geometry"` 
} 

// GeoJSON entity 
type Geometry struct { 
    Type  string   `json:"type" bson:"type"` 
    Coordinates [][][][]float64 `json:"coordinates" bson:"coordinates"` 
} 

함께 일하고 있어요 모델이며,이 코드의 덩어리 더 상황

추가

And here is an image example of the problem I'm having. 내가 질의를 할 때 나는 두 나라 모두를 얻었고, 빨강과 초록은 하나이지만, 진짜 부모는 초이다. 하나.

+0

golang을위한 지형 공간 라이브러리가 많이 있지만, 데이터를 저장하는 방법이나 지금까지해온 작업을 모른 채이 질문은 너무 일반적입니다. – Andrew

+0

Go를 사용하기 전에 일반 MongoDB 쿼리를 만들려고 했습니까? –

+0

네, 정확하게 말하고있는 것입니다. 몽고 쿼리는 이웃 나라의 경계가 상태와 겹치기 때문에 2 부모를 반환합니다. –

답변

0

한 폴리곤이 항상 다른 폴리곤의 영역 (완전히 포함 된 영역)이라고 가정 할 수있는 경우, 그 폴리곤을 중심점을 계산하는 대신 전체 폴리곤을 사용하고 점 또는 그 시점에서 부모를 상대로 시험 할 아주 작은 사각형. 경계 상자가있는 경우 중심점을 쉽게 찾을 수 있어야합니다.

그런 식으로 두 부모와 겹치는 가장자리에 나타나는 문제를 피할 수 있습니다. 영역이 부모 내에 있고 겹치지 않는 한 모든 영역에서 작동해야합니다.

그래서 두 개의 쿼리가 필요하지 않을 수도 있습니다. 단지 중심점을 중심으로 작은 사각형으로 상태를 계량하고 그 대신에 쿼리하십시오.

+0

맞습니다! 고마워! –