我有一个点的纬度和经度,然后我用半径计算圆来给出一个范围。我也有一个地理区域的纬度和经度范围(在这种情况下是一个州)。我试图找出圆圈的任何区域是否与任何区域相交。
基本上我正在寻找的最终结果是,如果一个点(地理编码地址)在任何状态的x英里范围内,它将返回该状态。
我确定有某种算法可以找到它,但我不知道从哪里开始寻找。
答案 0 :(得分:3)
a = sin²(Δlat/2) + cos(lat1)*cos(lat2)*sin²(Δlong/2)
c = 2*atan2(√a, √(1−a))
d = R*c
JavaScript的:
var R = 6371; // km
var dLat = (lat2-lat1)*Math.PI / 180;
var dLon = (lon2-lon1)*Math.PI / 180;
var lat1 = lat1*Math.PI / 180;
var lat2 = lat2*Math.PI / 180;
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
这将为您提供任意两点之间的大圆距离。其余的取决于你如何代表各州。
答案 1 :(得分:0)
http://en.wikipedia.org/wiki/Quad_tree
对于任何类型的二维空间关系来说,这都是一个很好的起点。
答案 2 :(得分:0)
如果你的帖子用Java而不用PHP标记,我不会尝试重新发明轮子,只是使用JTS(Java拓扑套件),创建一个几何体并调用方法
public boolean intersects(Geometry g)
我对PHP知之甚少,所以我不能告诉你是否有类似的PHP库。
几何形状来自哪里?如果您的几何存储在像PostGIS这样的数据库中,您也可以尝试调用一些底层函数,例如数据库调用
答案 3 :(得分:-2)
如果你试图查看单个点是否在一个圆圈内,你可以使用毕达哥拉斯'theoy。在下面的代码中,传递你的圆圈的centre_x,centre_y和半径,然后传递你正在评估的点的x,y。
def in_circle(centre_x, centre_y, radius, x, y):
square_dist = (centre_x - x) ** 2 + (centre_y - y) ** 2
return square_dist <= radius ** 2