Я работаю над проектом, в котором у меня есть места с координатами широты и долготы, хранящиеся в моей базе данных. Я использую Google Maps, чтобы отмечать эти места в качестве маркеров на карте. Я не хочу наносить на карту какие-либо «невидимые» маркеры (маркеры за пределами текущего окна просмотра/ограничивающей рамки). Поэтому я следую рекомендациям Google относительно управления маркерами области просмотра. .
У меня есть рабочее решение, в котором я использую AJAX для запроса веб-службы ASP.NET всякий раз, когда изменяется область просмотра моей карты. Этот веб-сервис вызывает хранимую процедуру в моей базе данных 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), а затем преобразовывать их в десятичные числа в моей хранимой процедуре, когда мне нужно выполнить вычисления.
Заранее спасибо!