2017-09-27 107 views
1

我正在使用MongoDB處理地理空間Web應用程序。我在有不同類別的集合(COUNTRY,STATE等)上有很多多邊形,我想知道哪個是某個STATECOUNTRY,但在某些情況下,鄰居COUNTRY的邊框正在觸摸STATE所以當我查詢交叉口時,我得到2個國家。多邊形重疊百分比

我想計算州和這兩個國家之間的重疊百分比,以知道哪一個是父級。我一直在尋找,但是我沒有找到任何這類操作的庫,我做這種算法並不是很好。


編輯:添加更多的上下文

這是我與

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"` 
} 

工作模式這是代碼塊我現在所擁有的:

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 
} 

And here is an image example of the problem I'm having.當我作出查詢時,我得到兩個國家,紅色和綠色的,但真正的父母是綠色的沒有。

+0

有相當的golang幾個地理空間庫,但不知道你是如何存儲數據,或者是什麼工作,你已經完成的工作,這個問題太籠統。 – Andrew

+0

在使用Go之前,您是否嘗試過使用簡單的MongoDB查詢? –

+0

是的,這正是我所展示的,mongo查詢返回2個父母,因爲鄰居國家的邊界​​與州的邊界重疊 –

回答

0

如果您可以假設一個多邊形始終是另一個多邊形的一個區域(完全由它包含),則可以不使用該區域的整個多邊形來計算其中心點,而是使用一個點或一個點非常小的廣場在這一點上對父母進行測試。如果你有一個邊界框,中心點應該很容易找到。

這樣,你避免你與重疊兩個親邊看到了問題,應該對任何地區工作,只要你知道這個地區是其父項內,而不只是將其覆蓋。

所以,你可能甚至不需要兩個查詢,只是減少state.Geometry圍繞其中心點一個小廣場和查詢與替代。

+0

你是對的!謝了哥們! –