다음 SQL (SQL Server)을 가지고 있고 대부분 작동합니다. 문제는 내가 진실이 아닌 광장을 만들고 있다는 것입니다. 내 목표는 위도와 경도가있는 도시와 주를 통과 한 다음 그 위도의 100 마일 반경 내에있는 모든 도시를 찾아내는 것입니다. 위도와 경도는 DB에 저장되므로 모든 값이 있습니다. 나는 그것을하는 더 정확한 방법이 필요하다. 여기에 지금까지 내 코드입니다 :주어진 반지름으로 결과 집합을 반환하는 방법
ALTER PROCEDURE [dbo].[sp_StoresByZipArea] (@zip nvarchar(5), @Radius float) AS
DECLARE @LatRange float
DECLARE @LongRange float
DECLARE @LowLatitude float
DECLARE @HighLatitude float
DECLARE @LowLongitude float
DECLARE @HighLongitude float
DECLARE @istartlat float
DECLARE @istartlong float
SELECT @iStartlat=Latitude, @iStartLong=Longitude from zipcodes where [email protected]
SELECT @LatRange = @Radius/((6076/5280) * 60)
SELECT @LongRange = @Radius/(((cos((@iStartLat * 3.141592653589/180)) * 6076.)/5280.) * 60)
SELECT @LowLatitude = @istartlat - @LatRange
SELECT @HighLatitude = @istartlat + @LatRange
SELECT @LowLongitude = @istartlong - @LongRange
SELECT @HighLongitude = @istartlong + @LongRange
/** Now you can create a SQL statement which limits the recordset of cities in this manner: **/
SELECT * FROM ZipCodes
WHERE (Latitude <= @HighLatitude) AND (Latitude >= @LowLatitude) AND (Longitude >= @LowLongitude) AND (Longitude <= @HighLongitude)
을 나는 [피타고라스 공식]을 제안하고 있었다 (http://stackoverflow.com/a/13032393/87698) ('된 우편 번호 SELECT * FROM WHERE ((위도 - @istartlat) * (경도 - @istartlong) + (경도 - @istartlong) <= (@Radius * @Radius)'), 그러나 나는 이것이 변환으로 인해 더 복잡하다는 것을 깨달았습니다. 위도/경도로 마일. – Heinzi
아마도 sql에서 사각형을 도시로 반환 한 다음 응용 프로그램 측에서 필터링하여 정밀도를 추가하십시오. sql이 많은 수의 클라이언트에 대해 너무 많은 수의 처리를 수행하는 것은 좋지 않습니다. 더 많은 앱 서버를 추가하는 것은 저렴합니다. –
도시 간 거리가 자주 변경되지 않으므로 이러한 결과를 모두 캐시 해 두십시오. –