【问题标题】:Selecting geographic points within a bounding box using SQLite and PHP?使用 SQLite 和 PHP 在边界框中选择地理点?
【发布时间】:2018-03-19 02:23:54
【问题描述】:

我正在编写一个 PHP/SQLite 后端 API,它需要返回地理边界框中的所有点。这将用于通过 AJAX 调用检索 Google 地图可见区域内的标记。

这是一开始听起来超级容易做的事情之一,只需做一个

SELECT * FROM markers WHERE lat <= :maxLat AND lat >= :minLat 
    AND lng <= :maxLng AND lng >= :minLng;

但是假设边界框是

minLat = 13
maxLat = 14
minLng = -178
maxLng = 179

即横跨-180/180度经度。现在上面的查询将改为选择边界框外的点!

如何使用 SQLite 和 PHP 解决这个问题?

【问题讨论】:

    标签: php sqlite google-maps-api-3 geospatial postgis


    【解决方案1】:

    好的,我想我明白了。

    我最终创建了一个不同的查询,具体取决于纬度的south 是否大于north 和/或经度的west 是否大于east,将它们组合起来,总共有4 个可能查询。

    // $coords = ['lngW'=>179, 'lngE'=>-178, 'latS'=>13, 'latN'=>14];
    
    $whereLng = $coords['lngE'] < $coords['lngW'] ? 
      '(lng >= :lngW OR lng <= :lngE)' : 
      '(lng >= :lngW AND lng <= :lngE)';
    
    $whereLat = $coords['latN'] < $coords['latS'] ? 
      '(lat >= :latS OR lat <= :latN)' : 
      '(lat >= :latS AND lat <= :latN)';
    
    $getStmt = $this->db->prepare(
      "SELECT * FROM places WHERE $whereLng AND $whereLat"
    );
    
    if( $getStmt->execute($coords) ){
        // Do something...
    }
    

    【讨论】:

      【解决方案2】:

      在这种情况下,数据库中所需的数据不是包含在一个矩形中,而是包含在两个矩形中。

      您的代码必须检测到这种情况 (minLng > maxLng) 并相应地更改查询。

      【讨论】:

      • 做到了,发布了完整的答案。
      猜你喜欢
      • 2014-02-08
      • 2020-02-19
      • 2020-04-02
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多