多边形重叠百分比
Polygon overlapping percentage
我正在使用 MongoDB 开发地理空间 Web 应用程序。我在一个集合中有很多不同类别(COUNTRY
、STATE
等)的多边形,我想知道哪个是某个 STATE
的 COUNTRY
但在某些情况下,邻居 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. 当我进行查询时,我得到了两个国家,红色和绿色,但真正的父级是绿色。
如果您可以假设一个多边形始终是另一个多边形的一个区域(完全包含在其中),您可以不使用整个多边形作为该区域而只计算它的中心点,并使用一个点或一个非常小的正方形,用于测试 parents。如果你有一个边界框,中心点应该很容易找到。
这样可以避免出现重叠两个 parent 的边的问题,只要您知道该区域在其 parent 范围内,它就应该适用于任何区域不只是重叠它。
所以您甚至可能不需要两个查询,只需将 state.Geometry 缩小到其 centre-point 周围的一个小方块,然后用它来查询。
我正在使用 MongoDB 开发地理空间 Web 应用程序。我在一个集合中有很多不同类别(COUNTRY
、STATE
等)的多边形,我想知道哪个是某个 STATE
的 COUNTRY
但在某些情况下,邻居 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. 当我进行查询时,我得到了两个国家,红色和绿色,但真正的父级是绿色。
如果您可以假设一个多边形始终是另一个多边形的一个区域(完全包含在其中),您可以不使用整个多边形作为该区域而只计算它的中心点,并使用一个点或一个非常小的正方形,用于测试 parents。如果你有一个边界框,中心点应该很容易找到。
这样可以避免出现重叠两个 parent 的边的问题,只要您知道该区域在其 parent 范围内,它就应该适用于任何区域不只是重叠它。
所以您甚至可能不需要两个查询,只需将 state.Geometry 缩小到其 centre-point 周围的一个小方块,然后用它来查询。