我正在使用MongoDB开发地理空间网络应用程序。我在具有不同类别(COUNTRY,STATE等)的集合上有很多多边形,我想知道哪个是COUNTRY某个多边形,STATE但是在某些情况下,邻居COUNTRY的边界碰到了多边形的边界,STATE所以当我查询十字路口,我有2个国家。
COUNTRY
STATE
我想计算该州与两个国家之间的重叠百分比,以了解哪个是父级。我一直在寻找,但是我没有找到具有这种操作的任何库,并且我做这种算法不是很好。
编辑:添加更多上下文
这是我正在使用的模型
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 }
这是我遇到的问题的图像示例。当我进行查询时,我得到了两个国家,红色和绿色,但是真正的父母是绿色。
如果可以假设一个多边形始终是另一个多边形的一个区域(完全包含在该多边形中),则可以不使用整个多边形作为该区域,而只需计算该多边形的中心点,并使用一个点或一个很小的正方形作为那一点要考验父母。如果您有边界框,那么应该很容易找到中心点。
这样,您可以避免重叠两个父对象的边出现的问题,并且只要您知道该区域在其父对象之内并且不只是与之重叠,它就适用于任何区域。
因此,您甚至不需要两个查询,只需将state.Geometry减小到围绕其中心点的小正方形,然后查询即可。