Нахождение городов в 'X' километры (или мили)

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

.flex {
  display: flex;
}

.justify-between {
  justify-content: space-between;
}
LOGO
BLABLABLA

Здесь, flex это свойство display, которое обычно используется в элементах контейнерного типа (например, div). Это помогает выровнять контент. Это позволяет использовать различные другие свойства, такие как justify-content, align-items * и другие. В этом случае мы используем только justify-content, в котором прямые дочерние элементы на главной оси (по умолчанию горизонтальные) выровнены со значением space-between, которое распределяет содержимое по мере возможности - и поскольку у нас есть только два прямые дети из

, LOGO и
, поместите первого слева и последнего справа.

*: вы можете узнать больше о свойствах Flexbox и вариантах использования в этой игре: https://flexboxfroggy.com/

12
задан Josh Lee 1 December 2009 в 10:23
поделиться

10 ответов

Это запрос MySQL, который будет делать именно то, что вы хотите. Имейте в виду, что такие вещи, как правило, являются приблизительными, поскольку Земля не является идеально сферической, и это не учитывает горы, холмы, долины и т. Д. Мы используем этот код на AcademicHomes.com с PHP и MySQL , он возвращает записи в пределах $ радиуса миль от $ широты, $ долготы.

$res = mysql_query("SELECT
    * 
FROM
    your_table
WHERE
    (
        (69.1 * (latitude - " . $latitude . ")) * 
        (69.1 * (latitude - " . $latitude . "))
    ) + ( 
        (69.1 * (longitude - " . $longitude . ") * COS(" . $latitude . " / 57.3)) * 
        (69.1 * (longitude - " . $longitude . ") * COS(" . $latitude . " / 57.3))
    ) < " . pow($radius, 2) . " 
ORDER BY 
    (
        (69.1 * (latitude - " . $latitude . ")) * 
        (69.1 * (latitude - " . $latitude . "))
    ) + ( 
        (69.1 * (longitude - " . $longitude . ") * COS(" . $latitude . " / 57.3)) * 
        (69.1 * (longitude - " . $longitude . ") * COS(" . $latitude . " / 57.3))
    ) ASC");
17
ответ дан 2 December 2019 в 07:04
поделиться

В зависимости от того, сколько городов вы включаете, вы можете предварительно вычислить список. Мы делаем это здесь для внутреннего приложения, где неточность + 100 м слишком велика для нашей установки. Он работает, имея две ключевые таблицы location1, location2, distance. Затем мы можем очень быстро отодвинуть местоположения на расстояние от местоположения1.

Кроме того, поскольку вычисления могут выполняться в автономном режиме, это не влияет на работу системы. Пользователи также получают более быстрые результаты.

1
ответ дан 2 December 2019 в 07:04
поделиться

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

Если у вас есть две локации (альфа и бета), вы можете рассчитать их расстояние, используя:

SQRT( POW(Alpha_lat - Beta_lat,2) + POW(Alpha_lon - Beta_lon,2) )
0
ответ дан 2 December 2019 в 07:04
поделиться

РЕДАКТИРОВАТЬ: Если у вас есть где-нибудь, список всех городов в мире вместе с их лат. и долго. значения, вы можете сделать поиск. В этом случае, см. Мою первую ссылку ниже для формулы для вычисления ширины одного продольного градуса на широте alt text:

alt text

Честно говоря, осложнения, стоящие за этой проблемой, таковы, что вам было бы гораздо лучше использовать такой сервис как Google Maps, чтобы получить ваши данные. В частности, Земля не является идеальной сферой, и расстояние между двумя градусами меняется по мере того, как вы находитесь ближе к экватору или дальше от него.

См. http://en.wikipedia.org/wiki/Geographic_coordinate_system для примеров того, что я имею в виду, и посмотрите API Карт Google .

3
ответ дан 2 December 2019 в 07:04
поделиться

Есть много (плохих вариантов)

  • Рассчитайте расстояние, используя математическую формулу (трактуйте X1-X2 и Y1-Y2) как векторы.

  • Заранее создайте таблицу соответствия со всеми комбинациями и сохраните расстояния.

  • Рассмотрите возможность использования MySQL-расширения для ГИС. Вот одна статья , которую я нашел об этом.

0
ответ дан 2 December 2019 в 07:04
поделиться

lessthandot.com на самом деле имеет 3 различных способа сделать это. вам придется немного пролистать блоги, но они есть. http://blogs.lessthandot.com/

0
ответ дан 2 December 2019 в 07:04
поделиться

Приведенная ниже функция взята из базы данных nerddinner (пример приложения ASP.NET MVC , доступной в codeplex ) (MSSQL).

ALTER FUNCTION [dbo].[DistanceBetween] (@Lat1 as real,
                @Long1 as real, @Lat2 as real, @Long2 as real)
RETURNS real
AS
BEGIN

DECLARE @dLat1InRad as float(53);
SET @dLat1InRad = @Lat1 * (PI()/180.0);
DECLARE @dLong1InRad as float(53);
SET @dLong1InRad = @Long1 * (PI()/180.0);
DECLARE @dLat2InRad as float(53);
SET @dLat2InRad = @Lat2 * (PI()/180.0);
DECLARE @dLong2InRad as float(53);
SET @dLong2InRad = @Long2 * (PI()/180.0);

DECLARE @dLongitude as float(53);
SET @dLongitude = @dLong2InRad - @dLong1InRad;
DECLARE @dLatitude as float(53);
SET @dLatitude = @dLat2InRad - @dLat1InRad;
/* Intermediate result a. */
DECLARE @a as float(53);
SET @a = SQUARE (SIN (@dLatitude / 2.0)) + COS (@dLat1InRad)
                 * COS (@dLat2InRad)
                 * SQUARE(SIN (@dLongitude / 2.0));
/* Intermediate result c (great circle distance in Radians). */
DECLARE @c as real;
SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a));
DECLARE @kEarthRadius as real;
/* SET kEarthRadius = 3956.0 miles */
SET @kEarthRadius = 6376.5;        /* kms */

DECLARE @dDistance as real;
SET @dDistance = @kEarthRadius * @c;
return (@dDistance);
END

Я предполагаю, что это может быть полезно.

0
ответ дан 2 December 2019 в 07:04
поделиться

Используя настройку со следующего URL-адреса, Ive построил запрос ниже. (Обратите внимание: я использую codeIgnitor для запроса базы данных)

http://howto-use-mysql-spatial-ext.blogspot.com/2007/11/using-circular-area-selection.html

function getRadius($point="POINT(-29.8368 30.9096)", $radius=2)
{
    $km = 0.009;
    $center = "GeomFromText('$point')";
    $radius = $radius*$km;
    $bbox = "CONCAT('POLYGON((',
        X($center) - $radius, ' ', Y($center) - $radius, ',',
        X($center) + $radius, ' ', Y($center) - $radius, ',',
        X($center) + $radius, ' ', Y($center) + $radius, ',',
        X($center) - $radius, ' ', Y($center) + $radius, ',',
        X($center) - $radius, ' ', Y($center) - $radius, '
    ))')";

    $query = $this->db->query("
    SELECT id, AsText(latLng) AS latLng, (SQRT(POW( ABS( X(latLng) - X({$center})), 2) + POW( ABS(Y(latLng) - Y({$center})), 2 )))/0.009 AS distance
    FROM crime_listing
    WHERE Intersects( latLng, GeomFromText($bbox) )
    AND SQRT(POW( ABS( X(latLng) - X({$center})), 2) + POW( ABS(Y(latLng) - Y({$center})), 2 )) < $radius
    ORDER BY distance
        ");

    if($query->num_rows()>0){
        return($query->result());
    }else{
        return false;
    }
}
0
ответ дан 2 December 2019 в 07:04
поделиться

Не изобретайте велосипед. Это пространственный запрос. Используйте встроенные пространственные расширения MySQL для хранения данных координат широта-долгота в типе столбца собственной геометрии MySQL . Затем используйте функцию Distance , чтобы запросить точки, которые находятся на заданном расстоянии друг от друга.

Отказ от ответственности: это основано на чтении документации, я сам не пробовал.

0
ответ дан 2 December 2019 в 07:04
поделиться

Я попытался использовать приведенный выше код, и ответы были слишком неправильными, когда расстояние между точками находилось в диапазоне 20–30 миль, и у меня все в порядке с ошибкой в ​​несколько миль. Поговорил с моим приятелем по картографии, и вместо этого мы придумали этот. Код написан на Python, но вы можете легко его перевести. Чтобы избежать постоянного преобразования в радианы, я переделал свою базу данных, преобразовав точки широты и долготы из градусов в радианы. Приятно то, что большая часть математических расчетов в основном выполняется один раз.

ra = 3963.1906 # radius @ equator in miles, change to km  if you want distance in km
rb = 3949.90275  # radius @ poles in miles, change to km  if you want distance in km
ra2 = ra * ra
rb2 = rb * rb

phi = self.lat

big_ol_constant = (math.pow(ra2*math.cos(phi), 2) + pow(rb2*math.sin(phi), 2))/ (pow(ra*math.cos(phi), 2) + pow(rb*math.sin(phi), 2))

sqlWhere = "%(distance)g > sqrt((power(lat - %(lat)g,2) + power(lng-%(lng)g,2)) * %(big_ol_constant)g)" % {
    'big_ol_constant': big_ol_constant, 'lat': self.lat, 'lng': self.lng, 'distance': distance}

# This is the Django portion of it, where the ORM kicks in.  sqlWhere is what you would put after the WHERE part of your SQL Query.
qs = ZipData.objects.extra(where=[sqlWhere]);

Кажется очень точным, когда расстояние друг от друга небольшое и в пределах 10 миль или около того, когда расстояние увеличивается до 200 миль (конечно, к тому времени у вас возникнут проблемы с «по прямой» и «асфальтированными дорогами») .

Вот модель ZipData, о которой я упоминал выше.

class ZipData(models.Model):
    zipcode = ZipCodeField(null=False, blank=False, verbose_name="ZipCode", primary_key=True)
    city = models.CharField(max_length=32, null=False, blank=False)
    state = models.CharField(max_length=2)
    lat = models.FloatField(null=False, blank=False)
    lng = models.FloatField(null=False, blank=False)

Дополнительное примечание: вы можете получить МНОГО геоданных, связанных с почтовыми индексами, на GeoNames.org , и у них даже есть некоторые API веб-сервисов, которые вы также можете использовать.

1
ответ дан 2 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

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