문제

두 도시 사이의 거리는 어떻게 계산하나요?

도움이 되었습니까?

해결책

지구의 곡률을 고려해야 하는 경우 대권 거리가 당신이 찾고 있는 것입니다. 위키피디아 기사 아마도 나보다 공식이 어떻게 작동하는지 더 잘 설명할 것입니다. 이 항공 처방집 페이지 더 자세히 설명하는 내용을 다루고 있습니다.

공식은 퍼즐의 첫 번째 부분일 뿐입니다. 임의의 도시에 대해 이 작업을 수행하려면 위도/경도를 가져올 위치 데이터베이스가 필요합니다.다행히도 이것을 무료로 얻을 수 있습니다 Geonames.org, 상업용 DB가 있지만 (Google에 문의하세요).따라서 일반적으로 원하는 두 도시를 찾아 위도/경도 좌표를 구하고 이를 다음과 같이 공식에 연결합니다. Wikipedia 작업 예제.

기타 제안사항:

  • 완전한 상업용 솔루션의 경우 있습니다 PC밀러 많은 트럭 회사가 선적 요금을 계산하기 위해 사용합니다.
  • Google 지도(또는 기타) API를 호출합니다.하루에 많은 요청을 수행해야 하는 경우 결과를 서버에 캐싱하는 것을 고려해 보세요.
  • 또한 매우 중요 도시, 교외, 타운 등에 대한 등가 데이터베이스 구축을 고려하는 것입니다.데이터를 그룹화해야 한다고 생각한다면.하지만 이 작업은 매우 복잡해지며 문제에 대해 모든 경우에 적용되는 단일 솔루션을 찾지 못할 수도 있습니다.

마지막으로 Joel은 얼마 전에 이 문제에 대한 기사를 썼습니다. 새로운 기능:구직 검색

다른 팁

당신은 Haversine 공식.

이는 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은 WGS84 타원체 지구 모델의 SRID입니다.

당신은 ㅏ* 두 도시 사이의 최단 경로를 찾는 알고리즘을 사용하면 거리를 얻을 수 있습니다.

지구와 같은 실제 구형 행성에 있는 두 실제 도시 사이의 최단 거리에 대해 이야기하고 있다면 대권 거리.

비행기에서 일하면서 원하는 경우 유클리드 거리 "일직선으로":

// 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);

삼각법이 필요하지 않습니다!그냥 그 피타고라스의 정리 그리고 정사각형은 항상 양수이므로 dx = abs(x1 - x0) 등이 필요하지 않다는 사실입니다.sqrt()에 전달할 양수를 얻으려면.

아마도 한 줄로 이 작업을 수행할 수 있으며 컴파일러는 아마 위의 코드와 동일하게 줄이십시오.

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

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

Google 지도 API를 통해 두 도시 사이의 거리를 확인할 수 있습니다.다음은 Python으로 구현한 것입니다.

#!/usr/bin/python
import requests
from sys import argv 
def get_distance(origin,destination):
    gmap='http://maps.googleapis.com/maps/api/distancematrix/json'
    payload={"origins":origin,"destinations":destination,"sensor":'false' }
    try:
        a=requests.get(gmap,params=payload)
        data = a.json()
        origin = str(data['origin_addresses'][0])
        destination= str(data['destination_addresses'][0])
        distance = data['rows'][0]['elements'][0]['distance']['text']
        return distance,origin,destination
    except Exception,e:
        print "The %s or %destination does not exists :(" %(origin,destination)
        exit()

if __name__=="__main__":
    if len(argv)<3:
        print "sorry Check the format"
    else:
        origin=argv[1]
        destination=argv[2]
        distance,origin,destination=get_distance(origin,destination)
        print "%s ---> %s    :   %s" %(origin,destination,distance)

예시 링크: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

도시의 위도/경도를 찾은 다음 위도/경도 좌표에 대한 거리 추정 알고리즘을 사용합니다.

코드 예제가 필요하다면 집에서 파헤칠 수 있는 것이 있는 것 같지만 이전 답변의 대부분과 마찬가지로 계산을 수행하려면 장/위도 db가 필요합니다.

두 도시 사이의 거리를 구하려면 조회 테이블을 사용하는 것이 좋습니다.

이는 * 거리 AI를 계산적으로 집중시키는 공식이기 때문에 의미가 있습니다.* 도시 간 거리는 변경될 가능성이 없습니다.

따라서 요구 사항이 매우 구체적이지 않은 한(위성이나 일부 또는 지형 알고리즘 등의 지형 매핑 등) 실제로 도시 목록과 도시 사이의 거리를 테이블에 저장하고 필요에 따라 조회해야 합니다.

나는 최근에 이것으로 많은 일을 해왔습니다.저는 SQL2008의 새로운 기능이 이 작업을 정말 쉽게 만들어준다고 생각합니다.100,000 레코드 테이블의 Xkm 내에 있는 모든 지점을 1초 미만의 시간에 찾을 수 있습니다...너무 초라하지는 않습니다.

내 테스트에서 대권(구형 가정) 방법은 빈센트 공식(지구가 무엇인지에 대한 타원체 가정)과 비교할 때 약 2.5마일 떨어져 있었습니다.

진짜 비결은 위도와 경도를 얻는 것입니다. 이를 위해 저는 Google을 사용하고 있습니다.

@Jared - 코드 예제를 약간 수정했습니다.첫 번째 코드 예제의 마지막 줄은 다음과 같아야 합니다.

dist = sqrt(dx*dx + dy*dy);

정보를 얻은 후에 변경되지 않을 경우 어떻게든 저장하는 데 동의합니다.@Marko Tinto T-SQL 샘플을 제공해 주셔서 감사합니다.SQL Server에 액세스할 수 없거나 다른 방법을 선호하는 경우:높은 정확도가 필요하다면 확인해 보세요. Vincenty 알고리즘에 대한 Wikipedia 항목 더 많은 정보를 위해서.나는 (아직은 아니더라도) 다른 언어로 쉽게 이식될 수 있는 js 구현이 있다고 믿습니다.또한 해당 페이지 하단에는 다음 링크가 있습니다. geographicLib, 이는 Vincenty 알고리즘보다 1000배 더 정확하다고 주장합니다(그렇게 좋은 데이터가 있으면 중요할 수 있음).

Vincenty 방법과 같은 것을 사용하는 이유는 무엇입니까?지구는 완벽한 구가 아니기 때문에 이와 같은 방법을 사용하면 지구 모델링을 위해 더 정확한 장축과 단축을 입력할 수 있습니다.

나는 사용한다 거리 너무 간단하고 깨끗해요

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top