多边形 rgeo 中的点

Point in polygon rgeo

我需要知道一个点是否在多边形中,在我的 rails 应用程序中,为了我想使用 rgeo gem.

要安装此 geme,我遵循了 rgeo git

上的说明

那么我确定 GEOS 和 Proj4 已正确安装。

我也加了这个gem'ffi-geos',没有特别的原因,只是跟着rgeo doc

最后我在 rails 控制台上进行了测试以检查是否正常工作

  1. poly_text = "POLYGON ..."(很多点,我知道第一点和最后一点是一样的,否则我认为这不会起作用,因为需要一个 cl osed 多边形)
  2. factory = RGeo::Cartesian::Factory(我使用的是笛卡尔工厂,因为根据我的调查,如果我使用球形工厂,这将无法工作)
  3. poly = factory.new().parse_wkt(poly_text)
  4. point1 = factory.new().parse_wkt("POINT (0 0)")(此点不属于多边形)
  5. poly.within?(point1)
  6. 结果:RGeo::Error::UnsupportedOperation:方法几何#contains?没有定义的。 来自 (irb):26

在这里你可以看到输出:

更多信息: rails 版本 5.1.2 idec9 osubuntu

如果有人有解决方案,在此先感谢,我也愿意使用另一个 gem,或者其他什么,我的目标是解决我的点/多边形问题。

您可以使用 Geokit,只需在您的 Gemfile 中包含 gem 'geokit'

然后你需要创建一个点数组,其中每个点都是一个 Geokit::LatLng.

例如:

points = []
points << Geokit::LatLng.new("-34.8922513", "-56.1468951")
points << Geokit::LatLng.new("-34.905204", "-56.1848322")
points << Geokit::LatLng.new("-34.9091105", "-56.170756")
polygon = Geokit::Polygon.new(points)
polygon.contains? polygon.centroid #this should return true

不用担心第一点与最后一点是否相同,new 已经解决了这一点,因为它在源代码中有解释 here

我在安装 GEOS 之前安装了 gem。卸载然后再次安装 rgeo gem 有效。

如果您只需要多边形中的点,则无需使用完整的库。非常简单,你可以随意抓取 Geokit 的实现(MIT 许可证):

def initialize(points)
    @points = points

    # A Polygon must be 'closed', the last point equal to the first point
    # Append the first point to the array to close the polygon
    @points << points[0] if points[0] != points[-1]
end

def contains?(point)
    last_point = @points[-1]
    oddNodes = false
    x = point.lng
    y = point.lat

    @points.each do |p|
        yi = p.lat
        xi = p.lng
        yj = last_point.lat
        xj = last_point.lng
        if yi < y && yj >= y ||
           yj < y && yi >= y
            oddNodes = !oddNodes if xi + (y - yi) / (yj - yi) * (xj - xi) < x
        end
        last_point = p
    end

    oddNodes
end

您可以找到完整的源代码here。当然,您必须创建自己的 class(es) 并稍微更改代码。