Вычисление расстояния между 2 [закрытыми] городами

С C # 4.0 отражение не требуется, поскольку DLR может вызывать его с использованием типов времени выполнения. Так как использование библиотеки DLR представляет собой боль динамически (вместо кода генерации компилятора C # для вас), open source framework Dynamitey (.net standard 1.5) дает вам простой кэшированный доступ во время выполнения те же вызовы, которые генерирует компилятор для вас.

var name = InvokeMemberName.Create;
Dynamic.InvokeMemberAction(this, name("GenericMethod", new[]{myType}));


var staticContext = InvokeContext.CreateStatic;
Dynamic.InvokeMemberAction(staticContext(typeof(Sample)), name("StaticMethod", new[]{myType}));

16
задан OysterD 29 August 2008 в 18:26
поделиться

11 ответов

Если необходимо принять искривление во внимание земли, Большое Круговое расстояние - то, что Вы ищете. статья Wikipedia, вероятно, делает лучшее задание объяснения как работы формулы, чем я, и существует также эта страница формуляра авиации, которая покрывает, который вдается в большее количество подробностей.

формулы являются только первой частью загадки, хотя, если необходимо сделать эту работу для произвольных городов, Вам будет нужна база данных местоположения для получения lat/long от. К счастью можно получить это бесплатно от Geonames.org , хотя существует коммерческий доступный дб (спросите Google). Так, в целом ищите эти два города, Вы хотите, получаете lat/long co-orinates и включаете их в формулу как в , Википедия Работала Пример .

Другие предложения:

  • Для полного коммерческого решения, существует Miler пк, который используется многими транспортными компаниями для вычисления фрахтовых ставок.
  • Выполняют вызовы к Google Maps (или другой) API. Если необходимо сделать много запросов в день, рассмотрите кэширование результатов на сервере.
  • Также очень важный должен рассмотреть создание эквивалентной базы данных для городов, пригорода, городов и т.д., если Вы думаете, что необходимо будет когда-либо группировать данные. Это действительно сложно, хотя, и Вы не можете найти единое решение для своей проблемы.

Наконец, что не менее важно, Joel написал статью об этой проблеме некоторое время назад, таким образом, здесь Вы идете: Новая возможность: Поиск работы

32
ответ дан 30 November 2019 в 15:52
поделиться

@Jared - незначительное исправление к Вашему примеру кода. Последняя строка первого примера кода должна читать:

dist = sqrt(dx*dx + dy*dy);
0
ответ дан 30 November 2019 в 15:52
поделиться

Я делал большую работу с этим недавно. Я нахожу, что новые возможности SQL2008 действительно делают это легким. Я могу найти все точки, которые являются скручиванием жгутов Xkm таблицы записи 100k в подвтором разе... не слишком потертом.

большой круг (сферическое предположение) метод в моем тестировании был приблизительно 2,5 мили прочь, когда по сравнению с vincenty формулой (эллипсоидальное предположение, которое является тем, что земля).

реальный прием получает lat и долго.. для этого я использую Google.

0
ответ дан 30 November 2019 в 15:52
поделиться

Лучше использовать таблицу поиска для получения расстояния между двумя городами.

Это имеет смысл потому что * Формула вычислять расстояние ais вполне в вычислительном отношении интенсивный.. * Расстояние между городами вряд ли изменится.

Поэтому, если Вам не нужно, очень конкретны (как ландшафт, отображающийся от спутника или некоторых или алгоритма топографии или чего-то еще), необходимо действительно просто сохранить список городов и расстояний между ними, в таблицу и искать его по мере необходимости.

0
ответ дан 30 November 2019 в 15:52
поделиться

Вы находите Lat/Lon города, затем используете алгоритм оценки расстояния для координат Lat/Lon.

0
ответ дан 30 November 2019 в 15:52
поделиться

если Вам нужен пример кода, я думаю, что у меня есть тот, который я мог бы вскопать дома, но как многие предыдущие ответы, Вам нужно длинное / lat дб, чтобы сделать вычисление

0
ответ дан 30 November 2019 в 15:52
поделиться

Если Вы работаете в плоскости, и Вы хотите Евклидово расстояние "по прямой":

// Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1]
dx = x1 - x0;
dy = y1 - y0;
dist = sqrt(dx*dx + dy*y);

Никакая тригонометрия не необходима! Просто Теорема Пифагора и то, что квадраты всегда положительны, таким образом, Вам не нужен дуплекс = брюшной пресс (x1 - x0), и т.д. чтобы заставить положительное число передавать sqrt ().

Примечание, что Вы могли, вероятно, сделать это в одной строке и компиляторе, будет , вероятно , уменьшают его эквивалент выше кода:

dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));

[1] http://en.wikipedia.org/wiki/Smoot

1
ответ дан 30 November 2019 в 15:52
поделиться

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

1
ответ дан 30 November 2019 в 15:52
поделиться

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

1
ответ дан 30 November 2019 в 15:52
поделиться

Это очень легко сделать с типом географии в SQL Server 2008.

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm

4326 SRID для модели

WGS84 elipsoidal Earth
2
ответ дан 30 November 2019 в 15:52
поделиться

Вы используете формула .

Haversine
9
ответ дан 30 November 2019 в 15:52
поделиться
Другие вопросы по тегам:

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