Найти северо-запад и юго-восток среди группы широт и долгот - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть куча данных о местоположении (Lat, Lng) внутри моей базы данных, и давайте предположим, что она имеет следующие столбцы:

Курорт

Широта

Долгота

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

Каков будет алгоритм для этого?

Таблица хранится внутри SQL Server, и я могу использовать SP или Function здесь.Кроме того, код C # также будет полезен.

РЕДАКТИРОВАТЬ

Мне нужно найти место на северо-западе и юго-востоке, чтобы определить прямоугольник.Мне нужно сначала разобраться с этим.Сейчас я не ищу способ найти места в этом прямоугольнике.

РЕДАКТИРОВАТЬ

Вот мое воображение для того, что мне нужно (извините за ужасный рисунок):

enter image description here

думаю, что это карта мира, а синие круги - курорты.Мне нужно найти лат и lng двух мест, которые я отмечаю коричневым кружком.

EDIT

@ Damien_The_Unbeliever указал, что я здесь не в том направлении,Моя цель - нарисовать прямоугольник, который содержит все места.И мой вопрос рассказывает другую историю.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

Вы действительно хотите использовать функцию, которая учитывает кривизну Земли, которая будет иметь разумное значение, если расстояния достаточно велики.

Например, вы можете создать функцию на основе форума Haversine :

CREATE FUNCTION [dbo].[LatLong_HaversineDistanceMiles] (
@lat1 float,
@lon1 float,
@lat2 float,
@lon2 float
)
RETURNS float AS
BEGIN 

declare @dlon float
declare @dlat float
declare @a float
declare @c float
declare @d float

select @dlon=radians(@lon2)-radians(@lon1)
select @dlat=radians(@lat2)-radians(@lat1)

select @a =square(sin(@dlat/2.0)) + (cos(radians(@lat1)) * cos(radians(@lat2)) * square(sin(@dlon/2.0)))
select @c = 2.0 * atn2(sqrt(@a), sqrt(1.0-@a))
select @d = 3956 * @c

return @d


end

Вы использовали бы его из предложения where, чтобы отфильтровать те, которые имеют значение> вашего радиуса.

2 голосов
/ 16 декабря 2011

Чтобы нарисовать прямоугольник, где все курорты помещаются внутри, приведем полный пример:

create table #testing (
Resort varchar(20),
Longitude int,
Latitude int
)

insert into #testing values ('Res 1', 10, 20)
insert into #testing values ('Res 2', -12, 30)
insert into #testing values ('Res 3', 3, -122)
insert into #testing values ('Res 4', 120, 120)
insert into #testing values ('Res 5', -2, 230)
insert into #testing values ('Res 6', 32, -2)

select
    min(Longitude) [Min Longitude],
    max(Longitude) [Max Longitude],
    min(Latitude) [Min Latitude],
    max(Latitude) [Max Latitude],
    convert(varchar, min(Longitude)) + "," + convert(varchar, max(Latitude)) [NW],
    convert(varchar, max(Longitude)) + "," + convert(varchar, min(Latitude)) [SE]
    from #testing

drop table #testing
1 голос
/ 16 декабря 2011

Если я правильно понимаю, у вас есть куча курортов с их координатами, и вы хотите ограничивающий «прямоугольник» для этих курортов.

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

Затем объедините эти значения, чтобы получить правильные углы.

РЕДАКТИРОВАТЬ
Вы можете использовать SQL следующим образом:

declare @minlat float, @maxlat float
select @minlat = min(latitude), @maxlat = max(latitude)
from resortstable

И похоже на долготу.Тогда (@minlat, @minlong) - это один угол, а (@maxlat, @maxlong) - другой.Возможно, вам придется изменить их: я не уверен, что широта означает N / S.

Для самого северо-западного курорта у вас возникает проблема: что если один курорт является самым северным, а другой - самым западным?Как вы собираетесь выбирать?

РЕДАКТИРОВАТЬ2
Допустим, у вас есть только два курорта, один в углу NE, а другой в углу SW.Может быть, добавьте еще немного на грубой линии между этими двумя.Какие сейчас уголки на северо-западе и юго-востоке?

...