Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确定重叠地理区域的算法_Php_Map_Geospatial - Fatal编程技术网

Php 确定重叠地理区域的算法

Php 确定重叠地理区域的算法,php,map,geospatial,Php,Map,Geospatial,我有一个点的纬度和经度,然后我用半径计算圆,给出一个范围。我还有一个地理区域的纬度和经度界限(在本例中是一个州)。我试图找出圆的任何区域是否和任何区域相交 基本上,我要寻找的最终结果是,如果一个点(地理编码地址)在任何州的x英里范围内,它将返回该州 我确信有某种算法可以找到这个,但我不知道从哪里开始寻找。 对于任何类型的二维空间关系,这都是一个很好的起点。使用: JavaScript: var R = 6371; // km var dLat = (lat2-lat1)*Math.PI / 18

我有一个点的纬度和经度,然后我用半径计算圆,给出一个范围。我还有一个地理区域的纬度和经度界限(在本例中是一个州)。我试图找出圆的任何区域是否和任何区域相交

基本上,我要寻找的最终结果是,如果一个点(地理编码地址)在任何州的x英里范围内,它将返回该州

我确信有某种算法可以找到这个,但我不知道从哪里开始寻找。

对于任何类型的二维空间关系,这都是一个很好的起点。

使用:

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;

这将为您提供任意两点之间的大圆距离。其余的取决于你如何表示状态。

如果你想知道一个点是否在一个圆内,你可以用毕达哥拉斯的理论来表示。在下面的代码中,传递圆的中心x、中心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
def in_圆(中心x,中心y,半径x,y):
平方距离=(中心x-x)**2+(中心y-y)**2

return square_dist如果你的文章是用Java标记的,而不是用PHP标记的,我不会尝试重新发明轮子,而只是使用JTS(Java拓扑套件),创建一个几何体并调用该方法

public boolean intersects(Geometry g)
我对PHP了解不多,所以我无法告诉您是否有类似的PHP库


几何图形来自哪里?如果几何图形存储在PostGIS之类的数据库中,您还可以尝试调用一些底层函数,例如数据库调用

如何表示您的州?州的数据来自Google的Geocode API。因此,对于伊利诺伊州,数据将来自此URL。这是一些疯狂的公式。我从来没有想过地球的曲率,也没有想过地球是平的,但这绝对是了不起的+1.我检索的状态是近似矩形边界,它不必100%准确,但google的地理编码API返回的边界为:36.9702980-91.5130789 42.5083379-87.0199349我不相信Haversine在这种情况下会起作用,因为我不试图确定点之间的距离,相反,如果给定半径内的任何点落在矩形边界内。@Josh:您可以测试该点到矩形中每个点的距离,如果每个点都失败,您可以测试该点是否位于矩形内(这些步骤可以互换)如果两者都失败,则计算与点之间具有给定距离的点,这些点正好位于点的北面、南面、西面和东面,并测试它们是否位于矩形内。如果所有这些测试都失败,则状态不在您的点的范围内。如果没有失败,则状态在范围内。这不考虑地球的曲率。地球不是二维欧几里德空间,因此四叉树不适用于此。
public boolean intersects(Geometry g)