从一个经纬度位置知道那个点是否在一个圆圈内

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 是您的纬度/经度列。