如何获取所有在某处半径内以及我正在寻找的半径内的数据?

Posted

技术标签:

【中文标题】如何获取所有在某处半径内以及我正在寻找的半径内的数据?【英文标题】:How to get data that is all within radius of somewhere, and within the radius I'm looking for? 【发布时间】:2019-12-01 23:22:47 【问题描述】:

我正在使用 postgres 和 postgis。

我的帖子有一个geometry,属性visible_within_m 是帖子应该在结果中显示的距离该点多少米。

我可以通过ST_DWithin(geometry, ST_SetSRID(ST_Point(a, b), 4326), 10000)在一些随机点的随机半径内找到帖子

但是,我想知道有多少帖子是可见,半径为某个随机点。

如何查看在某个任意点的半径范围内可见的帖子数量?

有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

您可以计算每个点与圆心之间的距离。如果距离大于半径,则为外部,否则为内部。

const EARTH_RADIUS     = 6371000;
const toRad            = function(num)return num*Math.PI/180;

var calculateDistance =
    function(lat1, lon1, lat2, lon2)
        var dLat = toRad(lat2 - lat1);
        var dLon = toRad(lon2 - lon1);
        var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(toRad(lat1)) * 
                Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
        var distance = EARTH_RADIUS * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        return distance;
    

【讨论】:

【参考方案2】:

不要使用恒定的距离值,而是使用visible_within_m中存储的值

SELECT * FROM mytable
WHERE ST_DWithin(geometry, ST_SetSRID(ST_Point(a, b), 4326), visible_within_m);

附带说明,st_dwithin 与几何图形使用投影的距离单位,因此对于 4326,它是以度为单位的(无意义的)距离,而不是以米为单位。

【讨论】:

谢谢。所以我只需要将类型转换为地理? 是的,地理与米一起使用。请注意相应地创建空间索引(即在geometry::geography上)

以上是关于如何获取所有在某处半径内以及我正在寻找的半径内的数据?的主要内容,如果未能解决你的问题,请参考以下文章

获取半径内的位置

从另一个邮政编码获取n英里半径内的所有邮政编码[关闭]

Android geofire获取一定半径内的用户列表

如何在特定半径内的地图上显示点

如何在经纬度半径范围内的 xml 文件中查找位置

从 Laravel 中的坐标获取半径内的用户