sql - 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)时效果很好。但是当缩小到国家大小时(即你可以看到整个国家),它在我的数据库中找不到重点。
在调试时,我发现经度数比我数据库中的任何点都小。这怎么可能?我拉近了看整个国家。
是不是我选择经纬度的方式不对?
解决方案
我不是地理专家,但这看起来很简单。让我们从经度开始。边界框可以在一侧或穿过反子午线:
-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 中,则不需要对面测试。
推荐阅读
- c# - 与 Microsoft.Build.Execution.BuildManager 并行构建解决方案
- math - 脑筋急转弯:在六边形中找到正确的旋转(顺时针/逆时针)
- javascript - 加载ajax请求后jQuery PreventDefault()不起作用
- c++ - OpenCV -SolvePNP 如何从世界坐标计算猜测
- javascript - 使用 CSS 计数器值作为相应元素 id 属性的 id?
- xml - Go 中的 XML Unmarshalling 给出了带有导出字段的空结果
- datetime - Java 8 - ChronoUnit.MONTHS.between(fromDate,toDate) 没有按预期工作
- c++ - 为什么 Coliru 的 Clang 无法编译 vector::push_back?
- swift - 从领域结果 Swift 中将 Int 转换为字符串
- python - Django - 带有外键的表格与画廊建模