【问题标题】:How can i fetch hotels that are stored in a database which are near a given latitude and longitude如何获取存储在给定纬度和经度附近的数据库中的酒店
【发布时间】:2026-02-09 17:30:02
【问题描述】:

我有一张表格,其中存储了酒店的纬度、经度和位置。我想实现的功能应该显示从数据库中获取的靠近由纬度和经度定义的给定点的酒店。

控制器

       function check()
       {
        $this->load->model('hotel');  
        $lat1=$this->input->post('lat');
        $lng1=$this->input->post('lng');
        $count['matched_data'] = $this->hotel->hoteldisplay($lat1,$lng1);
        $checkdb =count( $count['matched_data']);
        }
   Here is model:
            function hoteldisplay($lat1,$lng1)
           {
           $this->db->select("landmark,(3959 * acos( cos( radians($lat1) ) * 
           cos( radians(lat) ) * cos( radians(longi) - rad`ians($lng1)+sin( 
           radians($lat1) ) * sin( radians(lat) ) ) ) AS distance");  
           $this->db->having('distance' <= 25);                     
           $this->db->order_by('distance');                    
           $this->db->limit(20, 0);
           }

【问题讨论】:

  • 你的问题是什么?
  • 您的问题是什么?你用的是什么框架?
  • 认为他正在使用基于@YazanWYusuf 格式的codeigniter ....但我猜他的控制器模型是正确的,他想为标记创建一个客户端ajax事件函数..当标记固定它应该发布经纬度并返回响应并更新地图
  • 是的,我正在使用 codeigniter。我的问题是我应该使用什么查询来从基于纬度和经度的数据库中获取数据。例如:如果谷歌地图上的标记指向 latitude=15.3068003 和 longitude=78.45672230000002 那么它应该获取所有具有纬度的数据和经度接近指定的纬度和经度。
  • 是的,我已将 ajax 函数用于标记,它工作正常。但问题出在查询上。无论标记在谷歌地图上指向何处,它都会显示计数 0,即使数据库中保存了许多条目。请给我建议一个适当的查询,这会很有帮助。

标签: javascript php ajax


【解决方案1】:

您需要在 SQL 查询中应用半正弦距离。这是一个例子:

 SELECT z.zip,
        z.primary_city,
        z.latitude, z.longitude,
        p.distance_unit
                 * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                 * COS(RADIANS(z.latitude))
                 * COS(RADIANS(p.longpoint) - RADIANS(z.longitude))
                 + SIN(RADIANS(p.latpoint))
                 * SIN(RADIANS(z.latitude)))) AS distance_in_km
  FROM zip AS z
  JOIN (   /* these are the query parameters */
        SELECT  42.81  AS latpoint,  -70.81 AS longpoint,
                50.0 AS radius,      111.045 AS distance_unit
    ) AS p ON 1=1
  WHERE z.latitude
     BETWEEN p.latpoint  - (p.radius / p.distance_unit)
         AND p.latpoint  + (p.radius / p.distance_unit)
    AND z.longitude
     BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
         AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
  ORDER BY distance_in_km
LIMIT 15

取自here。至于 Code Igniter,你也可以在那里应用它,参见 here

【讨论】: