Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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_Mysql_Maps_Geospatial_Geocoding - Fatal编程技术网

Php 查询数据库以查找区域中的位置

Php 查询数据库以查找区域中的位置,php,mysql,maps,geospatial,geocoding,Php,Mysql,Maps,Geospatial,Geocoding,我感兴趣的是建立一个网站,将存储几个位置,需要能够找到他们的基础上,用户的查询。类似于Yelp、Zomato、Zillow等网站的功能。我首选的技术堆栈是PHP/MySQL 也就是说,我有几个相关的问题。给定一个位置数据库及其相关的纬度/经度坐标 他们如何查询自己的位置数据库并返回距离特定城市或邮政编码X以内的位置 此外,他们如何查询数据库中的位置,而不是在附近,而是在非常特定的城市或州范围内?他们从何处获取边界数据?如何有效地确定坐标是否位于该边界内 最后,我注意到一些网站在其网站上有特定于城

我感兴趣的是建立一个网站,将存储几个位置,需要能够找到他们的基础上,用户的查询。类似于Yelp、Zomato、Zillow等网站的功能。我首选的技术堆栈是PHP/MySQL

也就是说,我有几个相关的问题。给定一个位置数据库及其相关的纬度/经度坐标

  • 他们如何查询自己的位置数据库并返回距离特定城市或邮政编码X以内的位置
  • 此外,他们如何查询数据库中的位置,而不是在附近,而是在非常特定的城市或州范围内?他们从何处获取边界数据?如何有效地确定坐标是否位于该边界内
  • 最后,我注意到一些网站在其网站上有特定于城市的链接。我本以为城市数据会从远程地图API中提取出来,但它们通常会将图像和其他内容与这些城市关联起来。这些网站是否将所有城市的名称存储在自己的数据库中?他们从哪里得到他们的名单

  • 这将有助于你的第一点

    我使用此查询按距离起点的距离搜索数据库中的属性。起点是经度和纬度,
    $coordX
    $coordY
    。我通过在Google Maps API上查找地理代码获得了以下信息:

    SELECT properties.*, 
        (
            (   ACOS(SIN(".$coordX." * PI() / 180) * 
                SIN(coordX * PI() / 180) + COS(".$coordX." * PI() / 180) * 
                COS(coordX * PI() / 180) * COS((".$coordY." - coordY) * 
                PI() / 180)) * 180 / PI()) * 60 * 1.1515
            ) 
        AS distance 
    FROM properties 
    order by distance
    

    在我的表中,我将各个属性的坐标存储在
    coordX
    coordY
    列中。

    下面是MySQL函数,它将获取两个纬度/经度对,并以度为单位给出两点之间的距离。 它使用哈弗森公式来计算距离。因为地球不是一个完美的球体,所以在地球附近有一些误差 两极和赤道

    • 要转换为英里,请乘以3961
    • 要转换为公里,请乘以6373
    • 要转换为米,请乘以6373000
    • 要转换为英尺,请乘以(3961*5280)20914080

      分隔符$$

      创建函数
      haversine
      ( lat1浮子,lon1浮子, lat2浮子,lon2浮子 )返回浮动 无SQL 确定性 COMMENT'返回地球上两个已知经纬度点之间的距离(度)。要计算英里数,请乘以3961,公里数乘以6373' 开始 返回度(ACOS)( COS(弧度(纬度1))* COS(弧度(lat2))* COS(弧度(lon2)-弧度(lon1))+ SIN(弧度(lat1))*SIN(弧度(lat2)) )); 结束

      定界符

    使用浮点型(10,6)向地址表中添加纬度和经度列。 编写一个php脚本,在保存记录时查找lat/long

    然后,您可以对该表进行选择,以获得具有距离的地址列表。你甚至可以分类 结果将按距离显示,或将结果限制在距离参考位置一定的半径内

    SELECT 
        `street`,
        `city`,
        `state`,
        `zip`,
        (haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) as `distance`
    FROM `address_table`
    WHERE (haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) < 300    //  Example for limiting returned records to a raduis of 300 miles.
    ORDER BY haversine($ref_location_lat,$ref_location_long,`lat`,`long) DESC;      //  Don't need actual distance for sorting, just relative distance.
    
    选择
    `街`,
    `城市`,
    `州`,
    `拉链`,
    (haversine($ref_location_lat,$ref_location_long,`lat`,`long)*3961)表示距离`
    从“地址”表`
    其中(haversine($ref_location_lat,$ref_location_long,`lat`,`long)*3961)<300//将返回记录限制在300英里范围内的示例。
    haversine订购($ref_location_lat,$ref_location_long,`lat`,`long)DESC;//排序不需要实际距离,只需要相对距离。
    
    对于#1,您可能可以使用基于哈弗森公式的半径搜索。给定初始邮政编码和搜索距离。如果可以使用google maps API或类似工具获取lat/long,则可以使其更加精确。通常,距离查找包括存储每个位置的lat/long,并使用haversine函数计算用户位置(基于lat/long)与数据库中记录之间的距离。对于城市搜索,这通常基于位置地址的城市/州部分。这个问题对于这个站点来说似乎有点宽泛,但我建议您需要知道您感兴趣的点的纬度/经度。将其转换为弧度以便于使用。Lat是-pi对pi(90S到90N),lon是-pi对pi(180W到180E)。直线距离的公式很容易通过谷歌进行锥化,并且在局部地区的估计值足够接近。弄清楚某个东西是否在多边形区域内比较困难,我还没有弄清楚那一个。@sloachr使用地址的城市/州部分的问题是它们并不总是准确的。我住在一个大城市外的一个小城市,我经常收到带有正确街道地址和邮政编码的邮件,但城市是大城市,而不是我实际居住的地方。像Zillow这样的网站实际上会在地图上勾勒出一个城市的轮廓,或者允许用户绘制一个多边形。所以我想我要问的是,他们从哪里获得城市的多边形数据,以及如何找到其中是否有lat/lon?(更新了问题…)有商业数据库提供该信息。它也可以通过谷歌地图api获得,但使用上有限制。