首页 > 解决方案 > SQL选择边界框内的经纬度点

问题描述

我正在使用谷歌地图,我想查询我的 SQL 以找到边界框中的所有点。

在谷歌地图中,​​我使用这个 javascript 来获取边界矩形

var bounds = map.getBounds();
var ne = bounds.getNorthEast(), sw = bounds.getSouthWest();
var args = {
    NW: { lat: ne.lat(), lng: sw.lng() },
    NE: { lat: ne.lat(), lng: ne.lng() },
    SE: { lat: sw.lat(), lng: ne.lng() },
    SW: { lat: sw.lat(), lng: sw.lng() },
}; //NW = North-West, NE = North-East, SE = South-East, SW = South-West

然后,我正在使用 LINQ 从我的 SQL 数据库中选择所有位置:

//nw = North-West, ne = North-East, se = South-East, sw = South-West
double minLat = Math.Min(nw.Lat, Math.Min(ne.Lat, Math.Min(se.Lat, sw.Lat)));
double maxLat = Math.Max(nw.Lat, Math.Max(ne.Lat, Math.Max(se.Lat, sw.Lat)));
double minLng = Math.Min(nw.Lng, Math.Min(ne.Lng, Math.Min(se.Lng, sw.Lng)));
double maxLng = Math.Max(nw.Lng, Math.Max(ne.Lng, Math.Max(se.Lng, sw.Lng)));

return (from rec in tblPlaces.AsNoTracking()
        where (rec.Lat >= minLat) && (rec.Lat <= maxLat) && (rec.Lng >= minLng) && (rec.Lng <= maxLng)
        select rec).ToList<tblPlace>();

当它在相当大的缩放(谷歌缩放<= 15)时效果很好。但是当缩小到国家大小时(即你可以看到整个国家),它在我的数据库中找不到重点。

在调试时,我发现经度数比我数据库中的任何点都小。这怎么可能?我拉近了看整个国家。

是不是我选择经纬度的方式不对?

标签: sqlsql-servergoogle-mapslatitude-longitude

解决方案


我不是地理专家,但这看起来很简单。让我们从经度开始。边界框可以在一侧或穿过反子午线:

-180         0         +180
  |                      |
  |       +-----+        |
  |   -10 |  x  | +10    |
  |       +-----+        |
  |                      |
  |                   +-----+
  |              +170 |  x  | -170
  |                   +-----+
  |                      |

如果满足以下条件,则边界框内存在给定的经度:

lng1 <= lng2 AND (lng1 <= lng AND lng <= lng2) /* both edges on same side */
OR
lng1 >  lng2 AND (lng1 <= lng OR  lng <= lng2) /* edges on opposite sides */

如果满足以下条件,则边界框内存在给定的纬度:

lat1 >= lat2 AND (lat1 >= lat AND lat >= lat2) /* both edges on same side */
OR
lat1 <  lat2 AND (lat1 >= lat OR  lat >= lat2) /* edges on opposite sides */

如果纬度没有环绕,例如在 Google Maps API 中,则不需要对面测试。

对 db<>fiddlejsFiddle 的一些测试显示了 LatLngBounds 的工作原理


推荐阅读