当前位置: 首页 > 面试题库 >

多边形重叠百分比

苏建安
2023-03-14
问题内容

我正在使用MongoDB开发地理空间网络应用程序。我在具有不同类别(COUNTRYSTATE等)的集合上有很多多边形,我想知道哪个是COUNTRY某个多边形,STATE但是在某些情况下,邻居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 
}

这是我遇到的问题的图像示例。当我进行查询时,我得到了两个国家,红色和绿色,但是真正的父母是绿色。


问题答案:

如果可以假设一个多边形始终是另一个多边形的一个区域(完全包含在该多边形中),则可以不使用整个多边形作为该区域,而只需计算该多边形的中心点,并使用一个点或一个很小的正方形作为那一点要考验父母。如果您有边界框,那么应该很容易找到中心点。

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

因此,您甚至不需要两个查询,只需将state.Geometry减小到围绕其中心点的小正方形,然后查询即可。



 类似资料:
  • 我希望通过一条线串拆分一个多多边形(代表一个有岛屿的国家),从而将该县一分为二。 此结果是GeometryCollection对象中的一组多边形。如何将结果分组为两个多多边形对象,每个对象都包含各自一半的多边形? 使现代化 问题:确定分裂形状几何的“左”和“右”侧提供了一个很好的解决方案,其中从结果中的每个多边形中提取一个点,看看当与分裂的LineString结合时,它是否形成顺时针或逆时针线串。

  • Highcharts 柱形图 以下实例演示了使用百分比的堆叠柱形图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。在 plotOptions 中添加 stacking 属性: 配置 plotOptions:数据点选项 plotOptions用于设置图表中的数据点相关属性。plotOptions根据各种图表类型,其属性设置略微有些差异。 配置图表堆叠

  • 返回顶点的输入数组,并且附有一些其他方法,如下面所描述 polygon.area() 返回此多边形的标定区域。如果顶点是逆时针顺序,面积为正,否则为负。 polygon.centroid() 返回一个表示此多边形的质心的两元素数组。 polygon.clip(subject) 对这个多边形剪切主题多边形。换句话说,返回一个多边形表示这个多边形和主题多边形的交集。假定剪切的多边形是逆时针方向以及凸多

  • 我有一个“SpatialPolygons”对象,我想在@hole==FALSE处对多边形进行子集,并创建一个新对象。 使用下面的代码,一次可以预测得到1个多边形(如果@hole==TRUE,则没有),但我无法从对象中分割多个多边形。 我认为我的问题在于我不知道如何“一般”引用第二个列表,即从列表(Polygon)中获取项目,其中@孔==FALSE。将第二个[[]]留空不起作用。 附言:抱歉,没有可

  • 本文向大家介绍Java多边形重心计算,包括了Java多边形重心计算的使用技巧和注意事项,需要的朋友参考一下 多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + … + xnwn)/W y = (y1w1 + y2w2 + … + ynwn)/W 总结

  • 我有一个包含多边形的json,这些多边形表示一个国家中所有城市(总共78个)的分隔符。例如: 有没有什么方法可以用一个查询将所有城市的结果分组,或者我必须查询数据库78次才能获得每个城市的计数?