ruby - 点属于哪个多边形

标签 ruby postgis rgeo

我正在尝试找出某个点所在的区域(多边形)。

我正在尝试关注 Daniel Azuma 的 RubyConf2012 地理空间分析截屏视频。 以下代码始终返回 nil:

 Region.where{st_contains(poly, Point.last.coords)}.first

这是我的 Region 类:

 class Region < ActiveRecord::Base
attr_accessible :poly, :name, :multi

has_many :points

GEOFACTORY = RGeo::Geographic.simple_mercator_factory
set_rgeo_factory_for_column(:poly, GEOFACTORY.projection_factory)


def self.load

path = File.join(Rails.root, 'lib/tasks/uk/districts')
factory = GEOFACTORY
RGeo::Shapefile::Reader::open(path, :factory => factory) do |file|
    file.each do |record|
        name = record['NAME']
        region = Region.where(:name => name).first ||
         record.geometry.projection.each do |poly|
         Region.create(:name => name, :poly => poly)

        end
    end
end
end

积分等级:

class Point < ActiveRecord::Base
attr_accessible :coords

belongs_to :region

def self.find_region
  region = Region.where{st_contains(poly, Point.last.coords)}.first
  puts region
end

end

最佳答案

首先,你说你的查询返回 nil。嗯,事实并非如此。查询结果的 first 方法返回 nil。您的查询返回一个空数组。即它没有抛出错误,但没有产生任何结果。在 rgeo 中,当方法返回 nil 时,通常意味着其他含义。

您需要确保区域和点数据都来自相同的投影。您的点有可能是地理(经纬度)坐标。 PostGIS 只能在平面上进行空间连接。如果您将地理坐标格式化为地理类型(使用诸如 RGeo::Geography 工厂之类的东西),尝试对投影(平面)数据列使用地理形状进行空间连接应该会抛出错误。但如果您没有这样做,并生成了具有笛卡尔或几何类型的 Point 实例,则将地理点放入方法中肯定会返回 []。毕竟,32、-81 也是几何投影上的点。

最后一个点也可能根本不在区域形状内

关于ruby - 点属于哪个多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233075/

相关文章:

ruby - ActiveRecord 子查询内部连接

ruby-on-rails - 使用 PostGIS、RGeo、空间适配器按最近排序

ruby-on-rails - 检查一个日期是否在另外两个日期之间

ruby-on-rails - rails 4 simpecov 丢失文件

postgresql - 将 POINT 插入 postgres 数据库

python - 地理炼金术2 : find a set of Geometry items that doesn't intersect with a separate set

python - 如何计算 Django 中的 Frechet 距离?

ruby-on-rails - 尝试从纬度/经度创建点的 RGeo 错误

ruby - 有没有办法确定 redis 键是否包含列表或集合?

Ruby activerecord 结果到数组