С 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}));
Если необходимо принять искривление во внимание земли, Большое Круговое расстояние - то, что Вы ищете. статья Wikipedia, вероятно, делает лучшее задание объяснения как работы формулы, чем я, и существует также эта страница формуляра авиации, которая покрывает, который вдается в большее количество подробностей.
формулы являются только первой частью загадки, хотя, если необходимо сделать эту работу для произвольных городов, Вам будет нужна база данных местоположения для получения lat/long от. К счастью можно получить это бесплатно от Geonames.org , хотя существует коммерческий доступный дб (спросите Google). Так, в целом ищите эти два города, Вы хотите, получаете lat/long co-orinates и включаете их в формулу как в , Википедия Работала Пример .
Другие предложения:
Наконец, что не менее важно, Joel написал статью об этой проблеме некоторое время назад, таким образом, здесь Вы идете: Новая возможность: Поиск работы
@Jared - незначительное исправление к Вашему примеру кода. Последняя строка первого примера кода должна читать:
dist = sqrt(dx*dx + dy*dy);
Я делал большую работу с этим недавно. Я нахожу, что новые возможности SQL2008 действительно делают это легким. Я могу найти все точки, которые являются скручиванием жгутов Xkm таблицы записи 100k в подвтором разе... не слишком потертом.
большой круг (сферическое предположение) метод в моем тестировании был приблизительно 2,5 мили прочь, когда по сравнению с vincenty формулой (эллипсоидальное предположение, которое является тем, что земля).
реальный прием получает lat и долго.. для этого я использую Google.
Лучше использовать таблицу поиска для получения расстояния между двумя городами.
Это имеет смысл потому что * Формула вычислять расстояние ais вполне в вычислительном отношении интенсивный.. * Расстояние между городами вряд ли изменится.
Поэтому, если Вам не нужно, очень конкретны (как ландшафт, отображающийся от спутника или некоторых или алгоритма топографии или чего-то еще), необходимо действительно просто сохранить список городов и расстояний между ними, в таблицу и искать его по мере необходимости.
Вы находите Lat/Lon города, затем используете алгоритм оценки расстояния для координат Lat/Lon.
если Вам нужен пример кода, я думаю, что у меня есть тот, который я мог бы вскопать дома, но как многие предыдущие ответы, Вам нужно длинное / lat дб, чтобы сделать вычисление
Если Вы работаете в плоскости, и Вы хотите Евклидово расстояние "по прямой":
// 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));
Если Вы говорите о кратчайшем расстоянии между двумя реальными городами на реальной сферической планете, как Земля, Вы хотите большое круговое расстояние .
Вы приблизительно используете А* алгоритм для нахождения кратчайшего пути между теми двумя городами и этим способом, которым у Вас будет расстояние.
Это очень легко сделать с типом географии в 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