Математический вопрос о широте / долготе (расстояние между двумя координатами) - PullRequest
0 голосов
/ 31 мая 2011

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

http://www.movable -type.co.uk / scripts / latlong.html

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

Например, вместо расчета расстояния между каждым магазином в базе данных (более 30000), только групповые сlat / longs в пределах определенного диапазона и вычислите расстояние между ними.

Прямо сейчас я пытаюсь выяснить, как вычислить фактические границы.Расстояние должно быть ниже 5 км.Поэтому я делю 5 на 100 и ограничиваю широту и долготу этими суммами.

SELECT storeid, storedescription, address, city, storebannerdescription, lat, lon,
        ROUND (gc_dist (lat, lon, 43.758152, -79.746639), 1) AS distance
        FROM storelatlon
        WHERE ((lat-43.758152) < 0.05 AND (lat -43.758152) > -0.05) AND ( (lon-(-79.746639)) < 0.05 AND (lon-(-79.746639)) > -0.05)
        ORDER BY Distance

Ответы [ 2 ]

1 голос
/ 31 мая 2011

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

0 голосов
/ 31 мая 2011

Я предполагаю, что вы используете PostgreSQL, основываясь на использовании gc_dist.Пока у вас установлен PostGIS, вы можете выполнять желаемую логику, используя встроенную функциональность.

Для этого вам нужно подготовить таблицу:

Сначала сохраните свое местоположение какПостГИС точка.Я предлагаю использовать WGS-84 для географических расчетов.

После того, как вы это сделаете, вы можете запросить все точки на любом заданном расстоянии от желаемого местоположения, используя ST_Contains и ST_Buffer, где ST_Buffer охватывает центральную точку, для которой вы хотите найти соседей (-79.746639, 43.758152) в порядке long / lat.

Я никогда не использовал PostgreSQL для этого, но ясделали это с Oracle.Похоже, что для PostgreSQL используются те же настройки, что и для Oracle:

A.Сообщите базе данных, что вы будете создавать геометрический столбец. Здесь найден синтаксис .

SELECT AddGeometryColumn('db_name', 'table_name', 'desired_column_name', 4326,
'POINT', 2);

Выше 4326 - это постоянная "SRID", обозначающая WGS-84.

B.Добавьте индекс в столбец. Здесь найден синтаксис (эта страница кажется очень полезной).

CREATE INDEX desired_index_name
ON table_name
USING gist(desired_column_name);

C.Добавьте свои данные.

INSERT INTO table_name (desired_column_name)
VALUES('SRID=4326;POINT(-79.746639 43.758152)');

(мне любопытно, если приведенная выше строка должна содержаться в ST_GeomFromText на основе других примеров)

или ( я нашел здесь )

INSERT INTO table_name (desired_column_name)
VALUES (ST_Transform(ST_MakePoint(-79.746639, 43.758152), 4326));

Примечание: я предполагаю, что это (X, Y), что означает порядок широты и долготы.

D.Запросите ваши данные.

SELECT * FROM table_name
WHERE
    ST_Contains(
        ST_Buffer(
            ST_Transform(ST_MakePoint(-79.746639, 43.758152), 4326),
            distance_probably_in_meters),
        desired_column_name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...