2017-09-27 108 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

你是对的!谢了哥们! –