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中,则不需要对侧测试。

db<>上的一些测试小提琴和显示LatLngBounds如何工作的jsFiddle

我在看了经纬度教程后终于找到了答案。

总之:纬度在-90到90之间,经度在-180到180 之间

//Latitude
90 ----------------------  90
0 ----------------------   0
-90 ---------------------- -90
//Longitude
-180        0        180
|         |         |
|         |         |
|         |         |
|         |         |
-180        0        180

现在,边界框可以重叠。因此,在边界框(矩形(中,左侧可以大于右侧,或者顶部可以大于底部。基于如何使用Sql在矩形中搜索(预定义(位置(纬度/经度(?(见最后一个答案(,解决方案只是根据边界框的位置将所有组合合并

如果你能找到一个更好、更有效的解决方案,我会奖励你:(

干杯

相关内容

  • 没有找到相关文章

最新更新