PHP/MySQL: Выберите местоположения близко к данному местоположению от DB

Для EF Core 2.1 и выше:

Установите:

 dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4 

Затем обновите файл Startup.cs, как указано ниже.

using Microsoft.EntityFrameworkCore.Proxies;



services.AddEntityFrameworkProxies();
services.AddDbContext<BlogDbContext>(options =>
            {
                options.UseSqlite(Configuration.GetSection("ConnectionStrings")["DefaultConnection"]);
                options.UseLazyLoadingProxies(true);
            });
8
задан caw 21 May 2009 в 19:36
поделиться

6 ответов

MySQL Great Circle Distance (формула Хаверсина) делает именно то, что вам нужно.

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

Вычисление расстояния между почтовыми индексами в PHP имеет несколько PHP-реализаций этого алгоритма.

Geo Proximity Search - это почти та же проблема, что и у вас.

8
ответ дан 5 December 2019 в 14:06
поделиться

MySQL имеет возможность индексировать строки географически. Возможно, вам не придется делать это самостоятельно (вы можете просто попросить MySQL вычислить расстояние между двумя геообъектами и отсортировать по нему ..).

См .: http://forums.mysql.com/ read.php? 23,159205,159205

0
ответ дан 5 December 2019 в 14:06
поделиться

Для этого доступны функции MySQL.

http://dev.mysql.com/doc/refman/5.0/en/gis-introduction.html

0
ответ дан 5 December 2019 в 14:06
поделиться

Может быть, что-то вроде

SELECT field1, field2, ...,
    ACOS(SIN(latitude / 180 * PI()) * SIN(:1) + COS(latitude / 180 * PI()) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
    ORDER BY distance ASC;

или

SELECT field1, field2, ...,
    ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
    ORDER BY distance ASC;

(напрямую переведено из кода PHP)

: 1 и : 2 равно $ lat2 / 180 * pi () и $ long2 / 180 * pi () соответственно.

4
ответ дан 5 December 2019 в 14:06
поделиться

Это формула Хаверсина. Вы можете перевести PHP непосредственно в SQL, чтобы вы могли пространственно запрашивать базу данных (альтернативой является извлечение каждой записи из базы данных и прогон данных через PHP). MySQL предоставляет все необходимые математические функции.

Я сделал это для коммерческого веб-сайта, который предоставлял поиск расстояний на основе почтовых / почтовых индексов, так что это, безусловно, возможно без специальных функций ГИС.

1
ответ дан 5 December 2019 в 14:06
поделиться

Почему бы вам не использовать геопространственные функции MySQL ...? Нет, шучу.

Если 200 записей представляют собой реальные места, такие как города и т. Д., То можно ли в качестве альтернативы использовать API GeoNames?

Следующий веб-сервис предоставит 10 ближайших местоположений к предоставленным широте и долготе:

​​http://ws.geonames.org/findNearby?lat=47.3&lng=9

Источник: http://www.geonames.org/export/web-services.html#findNearbyPlaceName

Полный список: http://www.geonames.org/export/ws-overview.html

-1
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: