我正在使用谷歌地图,我想查询我的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在矩形中搜索(预定义(位置(纬度/经度(?(见最后一个答案(,解决方案只是根据边界框的位置将所有组合合并
如果你能找到一个更好、更有效的解决方案,我会奖励你:(
干杯