показать близлежащие места на основе сохраненной долготы и широты в базе данных. Angular6 + SQL Server - PullRequest
0 голосов
/ 07 сентября 2018

Когда приложение запущено, я хочу показать близлежащие (10 км) рестораны из моего местоположения, и эти рестораны будут сохранены в базе данных (SQL Server) в виде долготы и широты.

Пример: Ресторанный столик

restaurantId, name, longitude, latitude

1, Greek Restaurant, -72.374984, 41.274672

2, Italian Restaurant, -73.483947, 40.739283

...

Допустим, мое местоположение

longitude: -74.009056

latitude: 40.713744

, и если это можно решить, используя только sql, я бы использовал хранимую процедуру, передав эти значения в качестве параметров, а также соседнее значение в км(10 км) (@myLongitude, @myLatitude, @km).

или, если это можно решить с использованием угловых значений, я бы вызвал все данные из таблицы ресторанов и выполнил расчет для их сортировки.

Это мои основные предположения, но я не уверен, возможно ли это вообще.Как я могу найти близлежащие рестораны (10 км) на основе lng и lat, сохраненных в базе данных?

Карта не нужна, я просто хочу внести ее в список.Было бы еще лучше узнать, как далеко (в км) находится каждый ресторан от моего местоположения.

Спасибо за вашу помощь, фрагменты кода так ценятся!

1 Ответ

0 голосов
/ 07 сентября 2018

Я рекомендую использовать Географический тип данных вместо широты и долготы. Смотрите следующее демо

--this is your table
CREATE TABLE Landmark (
    Id int,
    Name VARCHAR(100),
    Latitude FLOAT,
    Longitude FLOAT
)

INSERT Landmark VALUES
(1, 'Greek Restaurant', -72.374984, 41.274672),
(2, 'Italian Restaurant', -73.483947, 40.739283)

--this is better table to query
WITH GeographyLandmark AS
(
    SELECT Id, Name, geography::STPointFromText('POINT(' + CAST(Latitude AS VARCHAR(20)) + ' ' + CAST(Longitude AS VARCHAR(20)) + ')', 4326) Location
    FROM LandMark
)
--this query calculates distance between point and localizations in meters
SELECT Id, Name,
    geography::STPointFromText('POINT(' + CAST(-74.009056 AS VARCHAR(20)) + ' ' + CAST(40.713744 AS VARCHAR(20)) + ')', 4326).STDistance(Location) Distance
FROM GeographyLandmark

Результаты:

Id    Name                 Distance
----- -------------------- ----------------
1     Greek Restaurant     150944,610588657
2     Italian Restaurant   44456,82536079

Ссылки: STDistance , STPointFromText

...