从一个经纬度位置知道那个点是否在一个圆圈内
From a lat long position knowing if that point its inside a circle
所以我有一个保存 latlong 数据的模型。我想做一个方法,我给 point_x, point_y ,看看我的 Location 模型是否有一个接近 500m 或更小的点。
这里有一个点的例子:
Location.longlat.x = 43.3233
Location.lonlat.y = 23.3233
point_x = 32.3233
point_y = 23.323
我使用 postgis 为我的模型存储那些 longlat 坐标。到目前为止,我知道将它们保存为球形点并且是º。
那么有没有一种方法可以将它们定义为平面点并计算它们是否接近500m或更小?
编辑:这就是我在模型中存储 longlat 坐标的方式:
t.geography "longlat", limit: {:srid=>4326, :type=>"st_point", :geographic=>true}
编辑:我正在尝试使用的脚本
ForecastLocation.all.each do |forecast_location|
ForecastLocation.where("ST_Distance_Sphere(ST_MakePoint(
{forecast_location.longlat.x},#{forecast_location.longlat.y}),
ST_MakePoint(#{circle_x},#{circle_y})<500")
ForecastLocation = 是模型名称
longlat= 上面定义的列,保存 x,y
circle_x
circle_y = 构成要点的变量,并将这个与我所有的 ForecastLocation.longlat
进行比较
我想做的是做与 select 答案中相同的事情,但只是让所有对象都小于 500 米的圆
您可以通过 ST_DistanceSphere
:
获得球体上两点之间的距离(以米为单位)
SELECT ST_DistanceSphere(
ST_MakePoint(43.3233, 23.3233),
ST_MakePoint(32.3233, 23.323)
);
--> 1122927.11865462
要select 500 米内的所有位置,您可以使用这样的方法:
SELECT *
FROM locations
WHERE ST_DistanceSphere(
ST_MakePoint(x, y),
ST_MakePoint(32.3233, 23.323)
) <= 500;
其中 locations
是您的 table,x
/ y
是您的纬度/经度列。
所以我有一个保存 latlong 数据的模型。我想做一个方法,我给 point_x, point_y ,看看我的 Location 模型是否有一个接近 500m 或更小的点。
这里有一个点的例子:
Location.longlat.x = 43.3233
Location.lonlat.y = 23.3233
point_x = 32.3233
point_y = 23.323
我使用 postgis 为我的模型存储那些 longlat 坐标。到目前为止,我知道将它们保存为球形点并且是º。 那么有没有一种方法可以将它们定义为平面点并计算它们是否接近500m或更小?
编辑:这就是我在模型中存储 longlat 坐标的方式:
t.geography "longlat", limit: {:srid=>4326, :type=>"st_point", :geographic=>true}
编辑:我正在尝试使用的脚本
ForecastLocation.all.each do |forecast_location|
ForecastLocation.where("ST_Distance_Sphere(ST_MakePoint(
{forecast_location.longlat.x},#{forecast_location.longlat.y}),
ST_MakePoint(#{circle_x},#{circle_y})<500")
ForecastLocation = 是模型名称
longlat= 上面定义的列,保存 x,y
circle_x
circle_y = 构成要点的变量,并将这个与我所有的 ForecastLocation.longlat
我想做的是做与 select 答案中相同的事情,但只是让所有对象都小于 500 米的圆
您可以通过 ST_DistanceSphere
:
SELECT ST_DistanceSphere(
ST_MakePoint(43.3233, 23.3233),
ST_MakePoint(32.3233, 23.323)
);
--> 1122927.11865462
要select 500 米内的所有位置,您可以使用这样的方法:
SELECT *
FROM locations
WHERE ST_DistanceSphere(
ST_MakePoint(x, y),
ST_MakePoint(32.3233, 23.323)
) <= 500;
其中 locations
是您的 table,x
/ y
是您的纬度/经度列。