Postgresql 如何获取所有在某处半径范围内且在半径I'内的数据;我在找什么?

Postgresql 如何获取所有在某处半径范围内且在半径I'内的数据;我在找什么?,postgresql,geolocation,postgis,Postgresql,Geolocation,Postgis,我正在使用postgres和postgis 我的帖子有一个几何体,属性可见_内_m,这是帖子应该在结果中显示的距离该点多少米 我可以通过做ST_DWithin(几何,ST_SetGrid(ST_Point(a,b),4326),10000),在一些随机点的一些随机半径内找到帖子 但是,我想知道有多少帖子是可见的,半径为某个随机点 如何查找任意点半径内可见的帖子数量 有更好的方法吗 您可以计算每个点与圆心之间的距离。如果距离大于半径,则它在外部,否则它在内部 const EARTH_RADIUS

我正在使用postgres和postgis

我的帖子有一个
几何体
,属性
可见_内_m
,这是帖子应该在结果中显示的距离该点多少米

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

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

如何查找任意点半径内可见的帖子数量


有更好的方法吗

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

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;
    }

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

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;
    }

使用存储在
visible\u in\u m

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

另一方面,
st_dwithin
与几何体一起使用投影的距离单位,因此对于4326而言,它是以度为单位的(无意义的)距离,而不是以米为单位。

使用存储在
visible_in_m

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

另一方面,
st_dwithin
与几何体一起使用投影的距离单位,因此对于4326来说,它是一个(无意义的)以度为单位的距离,而不是以米为单位的距离。

谢谢。所以我只需要将类型转换为地理?是的,地理与米一起工作。不过,请小心创建相应的空间索引(即在
geometry::geography
)谢谢。所以我只需要将类型转换为地理?是的,地理与米一起工作。但要小心创建相应的空间索引(即在
geometry::geography