Список географических мест рядом с пользовательским местоположением - PullRequest
2 голосов
/ 23 января 2011

У меня есть php webapp, который позволяет людям вставлять свое местоположение через API Google Maps (v3). Затем я сохраняю координаты широты и долготы в моей базе данных.

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

Таблица пользователей:

ID    U_Name    U_Location_ID
1     test      23

Таблица событий:

ID    E_Name    E_Location_ID
1     testevent 23

Таблица расположений:

ID    L_LAT        L_LNG        L_Name
23    40.759139    -73.979723   30 Rockefeller Plaza, New York, NY 10112, USA

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

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

Поэтому, когда член посещает сайт, я использую ip для определения местоположения api, который дает мне его страну и название города. У меня есть другой способ получить координаты широты / координаты страны / города, но теперь я застрял, когда мне нужно отобразить ближайшие события для этого города / страны.

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

Спасибо за вашу помощь

Ответы [ 5 ]

6 голосов
/ 23 января 2011

Здесь полный запрос в MySQL, который работает на всех таблицах.Помните, что поля lat / lon должны быть десятичными, если только вы не потеряете точность:

-- set your vars
SET @lat := $$$$$;
SET @lon := $$$$$;
SET @dist := $$$$$;

-- prepare a square in miles
SET @x1 := @lon - @dist / ABS(COS(RADIANS(@lat))*69);
SET @x2 := @lon + @dist / ABS(COS(RADIANS(@lat))*69);
SET @y1 := @lat - (@dist / 69);
SET @y2 := @lat + (@dist / 69);

SELECT  t.*, 
        3956 * 2 * ASIN(
            SQRT(
                POWER(
                    SIN(
                        (@lat - t.lat) * pi() / 180 / 2
                    ), 2
                ) +
                COS(
                    @lat * pi() / 180
                ) *
                COS(
                    t.lat * pi() / 180
                ) *
                POWER(
                    SIN(
                        (@lon - t.lon) * pi() / 180 / 2
                    ), 2
                )
            )
        ) as distance
FROM    `YourTable` t
WHERE   t.longitude BETWEEN @x1 AND @x2
AND     t.latitude BETWEEN @y1 AND @y2
HAVING  distance < @dist
ORDER BY distance
LIMIT 10;

Вам просто нужно заменить $$$$$ вашими значениями.Теперь, если вы хотите получить полное объяснение, посмотрите эти слайды Александра Рубина

А для километров просто замените x1, x2 ... на

-- prepare a square or in kilometers
SET @x1 := @lon - @dist / ABS(COS(RADIANS(@lat))*110);
SET @x2 := @lon + @dist / ABS(COS(RADIANS(@lat))*110);
SET @y1 := @lat - (@dist / 110);
SET @y2 := @lat + (@dist / 110);
1 голос
/ 24 августа 2012

Важно отметить, что если вы идете с замечательным ответом Ксавье - и - если вы используете изменение его километров, вы также должны изменить 3956 * 2 на 6371 * 2 в расчете, или вы просто меняете диапазон , а не произведенное расстояние.

0 голосов
/ 20 сентября 2011

Вот запрос, который может помочь вам получить все местоположения в пределах определенного диаметра. {КОЛИЧЕСТВО КИЛОМЕТРОВ} будет диаметром. $ lon AND $ lat поставит координаты местоположения пользователей.

SELECT <code>D. *, Градусы (ACOS (соз (RADIANS (90- latitude)) * соз (RADIANS (90- $ лат)) + sin (RADIANS (90- latitude)) * sin (RADIANS (90- $ лат)) * соз (радианы (longitude - $ долготы)))) / 360 * 40074 КАК distance ОТ location_table как D HAVING distance

0 голосов
/ 24 января 2011
0 голосов
/ 23 января 2011

Я не совсем понимаю вашу проблему.Если вы используете базу геолокации, такую ​​как MaxMind, вы также получите для каждого города широту / долготу.Вам просто нужно выбрать некоторую дельту для долготы и широты, выполнить SQL-запрос и рассчитать, на ваш взгляд, расстояние от местоположения пользователя до местоположения события.Это не очень сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...