Предисловие
Благодаря широкому развитию мобильного Интернета сегодня разработка приложений стала первым выбором для многих компаний, которые въехали в мобильный интернет. Автор разработал много приложений и обнаружил, что многие приложения имеют такую функцию, то есть для получения близлежащих людей. Как получить близлежащих людей? На самом деле, это очень просто. Он всегда должен записывать информацию о координатах пользователя (широта и долготы) в базе данных, а затем искать всех пользователей в базе данных и текущей позиции координат в определенном диапазоне на основе координат текущего пользователя.
Фактически, на расстоянии между двумя субъектами, чье географическое местоположение не меняется, лучше всего непосредственно статично. То есть напишите его непосредственно в конфигурации.
Например, найдите станцию метро возле вашего дома.
В этом случае, вообще говоря, предмет «дома» не будет «легко бегать». Не имеет смысла рассчитать расстояние один раз каждый запрос. Лучше всего сохранить расстояние и запрашивать его напрямую.
Другой случай:
Получите станцию метро возле расположения пользователя приложения
В этом случае географическое местоположение пользователя меняется. Таким образом, фактическое расстояние должно быть рассчитано в режиме реального времени каждый раз.
Идеи реализации
Обратитесь в Землю как стандартную сферу и используйте сферическую формулу расстояния, чтобы вычислить длину дуги большого круга между двумя точками на сферической поверхности.
Сферическое расстояние
Public Static Double GetDistance2 (Double Long1, Double LAT1, Double Long2, Double LAT2) {LAT1 = RAD (LAT1); LAT2 = RAD (LAT2); двойной a = lat1 - lat2; Double B = RAD (Long1 - Long2); Double sa2 = math.sin (a / 2.0); Double sb2 = math.sin (b / 2.0); Вернуть 2 * earth_mean_radius_km * math.asin (math.sqrt (sa2 * sa2 + math.cos (lat1) * math.cos (lat2) * sb2 * sb2));}Просто знайте широту и долготу между двумя точками.
Конечно, этот расчет должен быть размещен в базе данных, а затем отсортирован в соответствии с расстоянием. Просто принесите вышеупомянутую формулу в SQL.
Примеры близлежащих станций метро
Пример таблицы для строительства станции метро
Создать настольную станцию (ID int auto_increment Первичный ключ, имя Varchar (20) NULL Comment «Имя станции MRT», двойной комментарий LNG «долгота», LAT Double Null Comment 'Dimension');
Пример SQL
SET @TargetLat = 31.175702; SET @TargetLng = 121.519095; Select S.Id, S.Name, S.Lng, S.Lat, Round (6378.138 * 2 * ASIN (SQRT (POW (SIN (@Targetlat * PI () / 180 - S.Lat * PI () / 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2). @TargetLat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin (@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2))) * 1000) в качестве сортировки на расстоянии от расстояния от расстояния ASC, S.Idlimit 20;
Среди них TargetLat и TargetLng являются географическими местами пользователей.
Это действительно может достичь цели. Тем не менее, это должно вычислять расстояние между всеми данными и пользователем сначала, а затем сортировать его.
Когда количество станций метро слишком велико, эта операция будет менее элегантной. Мало того, что это не достаточно элегантно, но и очень эффективно.
оптимизация
Фактически, многие данные могут быть отфильтрованы перед расчета расстояния.
Нет необходимости рассчитать расстояние между станцией метро США при расчете расстояния между станциями Шанхайского метро.
Это можно отфильтровать некоторые нежелательные данные в первую очередь в большинстве приложений.
Например, когда данные различают города, вы можете изменить SQL на следующее:
SET @TargetLat = 31.175702; SET @TargetLng = 121.519095; SET @CityID = 605; SELECT S.Id, S.Name, S.Lng, S.Lat, Round (6378.138 * 2 * asin (SQRT (POW (SIN (@TargetLat * PI () / 180 - S. 2) + cos (@TargetLat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin (@TargetLng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) как на расстоянии от дистанции Sweer -City_ID = @ # # # # filter part of the the be at the be at the be at the be at the ac ac ac o cartidid osculed 20;
Вышеуказанное улучшение заключается в удалении большинства данных, которые будут рассчитаны перед расчетом. При поиске станции метро Чанши, сначала нет необходимости искать в Шанхае.
Конечно, эта ситуация немного особенная, потому что вы можете знать город, где пользователь находится заранее.
Другое улучшение:
С расположением пользователя в качестве центра нарисуйте круг с радиусом R, а затем обратно изгнать широту и диапазон долготы внешнего четырехугольника круга. Перед вычислением расстояния отфильтровайте данные за пределами долготы и долготы наружного четырехугольника.
Укажите идеальный радиус R и отфильтровать данные, которые не могут сначала соответствовать критериям.
Внешний четырехугольник обратного выталкивания
/*** Получите широту и долготу от четырех вершин точки на указанной широте и долготе {@Code Radius} Внешнее четырехугольник (строго говоря, это должен быть внешний куб)** @param lng Londitude* @param latitude* @param radius, int: km* @return <lng1, lng2, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat1, lat2>* @papar Tuple4 <Double> CalcboxByDistFrompt (Double LNG, Double LAT, Double Radius) {SpatialContext context = spatialContext.geo; Прямоугольник прямоугольник = context.getDistCalc () // .calcboxbydistfrompt (// context.makepoint (lng, lat), // radius * com.spatial4j.core.distance.distanceutils.km_to_deg, context, null //); Вернуть новый Tuple4 <> (rectangle.getMinx (), rectangle.getMaxx (), rectangle.getminy (), rectangle.getmaxy ());}Координаты Maven, используемые здесь, следующие:
<Depective> <groupid> com.spatial4j </GroupId> <artifactId> spatial4j </artifactid> <sersive> 0.5 </version> </deperency>
В настоящее время SQL можно изменить на это:
SET @TargetLat = 31.175702; SET @TargetLng = 121.519095; Select S.Id, S.Name, S.Lng, S.Lat, Round (6378.138 * 2 * ASIN (SQRT (POW (SIN (@Targetlat * PI () / 180 - S.Lat * PI () / 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2), 2). @TargetLat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin (@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2)) * 1000) в качестве станции расстояния (S.lng между $ {lng1} и $ {lng2). $ {lat1} и $ {lat2}) порядок по расстоянию ASC, S.Idlimit 20;Вышеуказанный LNG1, LNG2, LAT1, LAT2 - это диапазон внешнего четырехугольника.
Цитируемая информация: http://blog.csdn.net/a364572/article/details/50483568
Пример исходного кода
Сервис: https: //github.com/hylexus/bl ...
Инициализировать данные: https: //github.com/hylexus/bl ...
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.