두 주소 사이의 거리를 계산하기 위해 기존에 어떤 서비스가 있습니까?

StackOverflow https://stackoverflow.com/questions/115850

  •  02-07-2019
  •  | 
  •  

문제

특정 주소에 대한 근접성을 기준으로 정렬된 저장된 주소 목록을 표시하는 방법을 구현하고 싶습니다.

목록의 주소는 데이터베이스 테이블에 저장됩니다.별도의 부분에는 별도의 필드(우편번호, 도시 이름 등의 필드가 있음)가 있으므로 단순한 거대는 아닙니다. varchar.이러한 정보는 사용자가 입력하며 시스템 특성으로 인해 항상 완전하지 않을 수 있습니다(우편번호가 누락된 경우도 있고 도시 및 주 정도의 정보만 있을 수도 있음).

이것은 인트라넷 애플리케이션용이지만 인터넷 웹 서비스 액세스 등을 포함하여 외부 리소스를 사용하는 데 아무런 문제가 없습니다.나는 실제로 스스로하는 것이 사소한 것이 아니라면 내 자신을 굴리는 것보다 그것을 선호합니다.구글이나 야후!이미 무료 서비스를 제공하고 있으니 꼭 확인해 보고 싶습니다.키워드는 무료여야 한다는 것입니다. 이 기능은 말하자면 이미 보너스 "특전"이기 때문에 이 기능에 대해 이 프로젝트에 추가 비용을 도입할 자유가 없기 때문입니다.

나는 이것을 많은 오프라인 상점이 "위치 찾기" 기능을 수행하는 것과 매우 유사하다고 생각하고 있습니다.적절하게 정렬된 간단한 테이블에 표시하고 거리(예: 마일)를 표시하는 것이 좋습니다.지도 매시업을 표시하는 것이 훨씬 더 멋지지만 거리를 다시 가져오고 이후의 모든 표시 및 정렬을 처리하는 것만으로도 충분합니다.

단순 거리 알고리즘의 문제점은 데이터의 특성입니다.주소의 전체 또는 일부가 정의되지 않을 수 있으므로 위도/경도 좌표와 같은 편리한 것은 없습니다.또한 우편번호를 필수로 설정하더라도 주소의 90%는 아마도 동일한 5개의 우편번호를 갖게 될 것입니다.

엄청나게 빠를 필요는 없지만 대기 시간으로 인해 페이지에 표시되는 데 7초 이상이 걸리는 경우, 우리가 알고 있듯이 일반 사용자가 기다리기에는 너무 길어질 수 있습니다.이러한 가상 서비스가 한 번에 하나씩 쿼리하는 대신 일괄 주소 전송을 지원한다면 좋을 것입니다.그래도 주소 목록이 그 정도라면 총 50개를 넘지 않을 것 같아요.

도움이 되었습니까?

해결책

Google 그리고 야후! 둘 다 무료로 지오코딩 서비스를 제공합니다.다음을 사용하여 거리를 계산할 수 있습니다. Haversine 공식 (.NET 또는 SQL로 구현됨).두 서비스 모두 부분 검색(우편번호만, 도시만)을 수행할 수 있으며 결과의 정확도를 알려줍니다. 따라서 Yahoo!에서는 의미 있는 정보가 없는 위치를 제외할 수 있습니다.Google보다 더 정확한 정보를 제공합니다).

다른 팁

Google Maps API는 이용 약관으로 인해 귀하에게 좋지 않습니다.그러나 Yahoo는 주소를 경도/위도 좌표로 변환하여 거리를 계산하는 데 사용할 수 있는 REST 서비스를 제공합니다.그것은 여기.

우편번호를 입력하도록 요구한 다음 우편번호를 위도/경도 쌍에 매핑하는 데이터베이스 테이블을 만듭니다(또는 온라인에서 찾아보세요).당신이 일하는 곳이 어떤지는 모르겠지만 여기서는 우편번호가 몇 미터마다 다를 수 있으므로 충분히 정확해야 합니다.그런 다음 이 방법을 사용하여 두 우편번호 사이의 거리를 계산합니다.

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit)
{
  double theta = lon1 - lon2;
  double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
  dist = Math.Acos(dist);
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  if (unit == 'K')
  {
    dist = dist * 1.609344;
  }
  else if (unit == 'N')
  {
    dist = dist * 0.8684;
  }
  return (dist);
}

private static double deg2rad(double deg)
{
  return (deg * Math.PI / 180.0);
}

private static double rad2deg(double rad)
{
  return (rad / Math.PI * 180.0);
}

지오코딩 서비스에 비해 자신의 코드를 사용하면 데이터에 대해 더 흥미로운 계산을 수행할 수 있을 뿐만 아니라 데이터와 함께 데이터를 DB에 저장할 수 있다는 장점이 있습니다.

Google 지도 API를 사용하여 거리를 확인하고 정렬할 수는 없나요?

http://code.google.com/apis/maps/

Google 지도 API를 조사해 보는 것이 좋습니다.

외부 연결이 필요하지만(그리고 이를 통해 데이터를 웹 서비스로 분류해도 괜찮음) 필요한 것, 즉 두 지점 사이의 경로를 요청하고 거리를 구하여 거리를 제공합니다. 그것.

길찾기 API의 API 참조

우리 회사에서 했던 일 중 하나는 우편번호의 위도/경도(대략 우편번호 지역의 중앙)를 속여 이용하는 것입니다.완벽하지는 않지만 y 유형의 검색에서 n마일 이내에 있는 x를 찾을 수 있을 만큼 충분히 가깝습니다. 이는 주소 정리 서비스에서 주소를 인식할 수 없는 경우에 특히 유용합니다.

어느 시점에서 나는 이 근사치에 사용할 위도/경도 조회 테이블에 대한 무료 우편 번호를 발견했습니다.죄송합니다. 더 이상 링크가 없습니다.

이 웹사이트를 확인해 보세요: http://geocoder.us/help/utility.shtml

다음과 같이 15초당 1개씩 레코드를 처리할 수 있습니다.http://geocoder.us/service/distance?zip1=95472&zip2=94305

시간제한 없는 구독 서비스도 있어요

다른 사람이 이미 에 완료했습니다. 멍청한 논리 (편집하다:오식).그들은 Google Maps API를 다음과 같이 사용합니다. 대원 공식.구현이 어렵지는 않을 것 같아요.

업데이트:실제로는 선호하는 공급자로부터 좌표를 얻은 다음 코드로 계산을 수행하기만 하면 됩니다.사용자가 위치를 제공할 때 상점 좌표를 미리 로드할 수 있습니다. 이를 유효성 검사에 사용할 수도 있습니다.그러면 요청이 들어오면 고객의 위치만 조회할 수 있습니다.

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