Похоже, вы выбираете расстояние между двумя точками. В SQL Server 2008 вы можете использовать метод STDistance
типа данных geography
. Это будет выглядеть примерно так:
SELECT TOP 20
geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p)
FROM markers
WHERE geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p) < 25
ORDER BY geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p);
Где p
будет полем типа geography
вместо двух отдельных decimal
полей. Возможно, вы также захотите создать пространственный индекс в своем поле p
для повышения производительности.
Чтобы использовать тип данных geography
, просто укажите свое поле как geography
в вашем CREATE TABLE
:
CREATE TABLE markers (
id int IDENTITY (1,1),
p geography,
title varchar(100)
);
Вставка значений в таблицу markers
теперь будет выглядеть так:
INSERT INTO markers (id, p, title)
VALUES (
1,
geography::STGeomFromText('POINT(-122.0 37.0)', 4326),
'My Marker'
);
Где -122.0
- это долгота, а 37.0
- это широта.
Создание пространственного индекса будет выглядеть примерно так:
CREATE SPATIAL INDEX ix_sp_markers
ON markers(p)
USING GEOGRAPHY_GRID
WITH ( GRIDS = (HIGH, HIGH, HIGH, HIGH),
CELLS_PER_OBJECT = 2,
PAD_INDEX = ON);