多边形 rgeo 中的点
Point in polygon rgeo
我需要知道一个点是否在多边形中,在我的 rails 应用程序中,为了我想使用 rgeo gem.
要安装此 geme,我遵循了 rgeo git
上的说明
那么我确定 GEOS 和 Proj4 已正确安装。
我也加了这个gem'ffi-geos',没有特别的原因,只是跟着rgeo doc
最后我在 rails 控制台上进行了测试以检查是否正常工作
- poly_text = "POLYGON ..."(很多点,我知道第一点和最后一点是一样的,否则我认为这不会起作用,因为需要一个 cl osed 多边形)
- factory = RGeo::Cartesian::Factory(我使用的是笛卡尔工厂,因为根据我的调查,如果我使用球形工厂,这将无法工作)
- poly = factory.new().parse_wkt(poly_text)
- point1 = factory.new().parse_wkt("POINT (0 0)")(此点不属于多边形)
- poly.within?(point1)
- 结果: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) 并稍微更改代码。
我需要知道一个点是否在多边形中,在我的 rails 应用程序中,为了我想使用 rgeo gem.
要安装此 geme,我遵循了 rgeo git
上的说明那么我确定 GEOS 和 Proj4 已正确安装。
我也加了这个gem'ffi-geos',没有特别的原因,只是跟着rgeo doc
最后我在 rails 控制台上进行了测试以检查是否正常工作
- poly_text = "POLYGON ..."(很多点,我知道第一点和最后一点是一样的,否则我认为这不会起作用,因为需要一个 cl osed 多边形)
- factory = RGeo::Cartesian::Factory(我使用的是笛卡尔工厂,因为根据我的调查,如果我使用球形工厂,这将无法工作)
- poly = factory.new().parse_wkt(poly_text)
- point1 = factory.new().parse_wkt("POINT (0 0)")(此点不属于多边形)
- poly.within?(point1)
- 结果: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) 并稍微更改代码。