我正在尝试找出某个点所在的区域(多边形)。
我正在尝试关注 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/