我正在做一个项目,我的数据库中存储了纬度和经度坐标的地方。我使用谷歌地图将这些地方绘制为地图上的标记。我不想在地图上绘制任何“不可见”标记(当前视口/边界框之外的标记)。因此,我遵循Google 关于视口标记管理的建议。
我有一个可行的解决方案,只要我的地图视口发生变化,我就使用 AJAX 查询 ASP.NET Web 服务。此 Web 服务调用我的 MSSQL 数据库中的存储过程,以获取坐标位于当前视口/边界框内的所有位置。存储过程如下所示:
ALTER PROCEDURE dbo.GetPlacesInsideBoundingBox
(
@swLat VarChar(11), /* south-west point latitude */
@swLng VarChar(11), /* south-west point longitude */
@neLat VarChar(11), /* north-east point latitude */
@neLng VarChar(11) /* north-east point longitude */
)
AS
/* SET NOCOUNT ON */
SELECT * FROM dbo.Place WHERE
place_lat >= CONVERT(Decimal(11,8), @swLat)
AND place_lat <= CONVERT(Decimal(11,8), @neLat)
AND place_lng >= CONVERT(Decimal(11,8), @swLng)
AND place_lng <= CONVERT(Decimal(11,8), @neLng)
RETURN
发送到存储过程的参数只是视口/边界框西南角和东北角的纬度和经度。然后我将这些点与存储在我的数据库中的经度和纬度值进行比较,以查看当前视口/边界框内的位置。
这很好用!但是我读到,如果经度(本初子午线以西)为负值,则可能会遇到问题,并且简单的解决方案是在经度为负时将 360 添加到经度上。
我有两个问题:
如何更改我的存储过程(上图)以考虑负经度?
我应该考虑对这个存储过程进行任何其他修改以使其万无一失吗?
如果您想知道从 VarChar 到 Decimal 的转换,我发现在客户端 (javascript) 上使用简单的字符串会更容易,然后在我需要进行计算时在我的存储过程中将它们转换为十进制数字。
提前致谢!