多边形重叠百分比

Posted

技术标签:

【中文标题】多边形重叠百分比【英文标题】:Polygon overlapping percentage 【发布时间】:2018-03-09 09:43:51 【问题描述】:

我正在使用 MongoDB 开发地理空间 Web 应用程序。我在具有不同类别(COUNTRYSTATE 等)的集合中有很多多边形,我想知道哪个是某个 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. 当我进行查询时,我得到了两个国家,红色和绿色的国家,但真正的父母是绿色的国家。

【问题讨论】:

golang的地理空间库有不少,但是不知道你是怎么存储数据的,也不知道你目前做了什么工作,这个问题太笼统了。 在使用 Go 之前,您是否尝试过进行简单的 MongoDB 查询? 是的,这正是我所展示的,mongo 查询返回 2 个父母,因为邻国的边界与州的边界重叠 【参考方案1】:

如果您可以假设一个多边形始终是另一个多边形的区域(完全包含在其中),您可以不使用整个多边形来计算该区域的中心点,而是使用一个点或一个非常小方块在这一点上对父母进行测试。如果你有一个边界框,中心点应该很容易找到。

这样您就可以避免出现与两个父级重叠的边缘的问题,并且它应该适用于任何区域,只要您知道该区域在其父级内而不只是重叠它。

因此,您甚至可能不需要两个查询,只需将 state.Geometry 缩减为围绕其中心点的一个小正方形,然后用它进行查询。

【讨论】:

以上是关于多边形重叠百分比的主要内容,如果未能解决你的问题,请参考以下文章

多多边形地理并集的高效计算技术

是否可以选择多个多边形的最大重叠

[python][原创]判断2个多边形是不是重叠

ArcGIS怎么分别计算每个重叠的缓冲区与其他多边形的重叠面积?

如何计算被另一个多边形覆盖的多边形的百分比

如何制作与标题重叠的多边形形状?