지오코딩을 사용하여 주소에 대한 지리적 좌표 검색

프로그램은 Geocoder 클래스를 사용하여 주소에 대한 지리적 좌표를 검색할 수 있습니다. 예를 들어, 프로그램은 사용자에게 주소에 대한 메시지를 표시한 다음 해당 주소를 지도에 표시할 수 있습니다. 주소는 비체계적인 문자열 형태거나 MapLocation 객체일 수 있습니다. 지오코딩 요청은 동기화 또는 비동기화될 수 있습니다.

주소 지정

제공하는 주소가 상세할수록 더 정확한 결과를 얻을 수 있습니다. 예를 들어, 거리 이름만 입력하면 지오코딩 서버는 많은 양의 결과를 반환합니다. 그러나 요청 시 충분한 지리적 컨텍스트를 제공하면 해당 주소에 대해 적은 양의 정보를 얻을 수 있습니다. 비체계적인 주소 문자열은 체계적인 주소와 항상 동일한 결과를 제공하지는 않습니다.
// Structured address
MapLocation address1 = new MapLocation();
address1.addData(MapLocation.LBS_LOCATION_CITY_KEY, "waterloo");
address1.addData(MapLocation.LBS_LOCATION_COUNTRY_KEY, "canada");
address1.addData(MapLocation.LBS_LOCATION_STREET_ADDRESS_KEY, "419 phillip st");
address1.addData(MapLocation.LBS_LOCATION_POSTAL_CODE_KEY, "N2L3X2");
// Unstructured address
String address2 = new String("419 phillip st, waterloo, canada, N2L3X2");

주소에 지리적 컨텍스트 제공

지오코딩 서버로부터 가장 적절한 결과를 얻으려면 지오코딩 요청에 지리적 컨텍스트를 제공해야 합니다. 컨텍스트를 제공하기 위해 지리적 좌표(예: BlackBerry 단말기 사용자의 현재 위치)를 포함하는 MapDimensions 객체를 생성할 수 있습니다. 컨텍스트를 제공하면 사용자가 주소만 제공하더라도 관련된 프로그램이 적절한 지리적 좌표를 수신할 수 있습니다. MapDimensions 객체를 제공하지 않은 경우, 프로그램은 BlackBerry Maps 에 저장된 최근 위치를 컨텍스트로 사용하며, 이로 인해 원하는 결과가 제공되지 않을 수도 있습니다.

최상의 결과를 얻으려면 프로그램으로부터 컨텍스트를 제공하는 것이 좋습니다. 프로그램이 요청에 충분한 컨텍스트를 제공하지 않으면 무관한 검색 결과를 얻을 수도 있습니다. 지오코딩 요청에 사용할 MapDimensions 객체를 만들 때 너비, 높이, 확대/축소 및 회전 값은 중요하지 않습니다.
MapPoint origin = new MapPoint(43.4815, -80.5407);
MapDimensions context = new MapDimensions(origin, 480, 360, 5, 0);

비동기 지오코딩 요청 보내기

비동기 지오코딩 요청을 보낼 때 ServerExchangeCallback 인터페이스를 구현하는 클래스에 대한 참조를 전달해야 합니다(다음 코드 샘플에서 callback 변수로 표현됨). 주소, 요청에 대한 지리적 컨텍스트(예: 사용자의 현재 위치) 및 요청이 시간 초과되기까지의 시간 길이도 제공해야 합니다. Geocoder.geocode()를 호출할 때 프로그램은 이 요청을 지오코딩 서버로 보내고 결과가 나오면 적절한 ServerExchangeCallback 메소드를 호출합니다.
MyServerExchangeCallback callback = new MyServerExchangeCallback();
try
{
    Geocoder.getInstance().geocode(callback, address1, context, 0);
} 
catch (GeocodeException e)
{
    // Do something with the exception
}

ServerExchangeCallback 인터페이스를 구현하는 클래스를 만들기 위해 프로그램에 포함해야 하는 메소드에는 requestSuccess(), requestFailure()requestHalted()의 세 가지가 있습니다. 지오코딩 요청이 완료되면 프로그램은 요청 결과에 따라 세 메소드 중 하나를 호출합니다.

지오코딩 요청이 성공적으로 이루어지면 검색 결과의 Vector를 포함하는 GeocodeExchange 객체가 반환됩니다. 검색 결과는 GeocodeExchange.getResults()를 호출하여 액세스할 수 있습니다. net.rim.device.api.lbs.maps.model.MapLocation의 각 색인은 표시 이름, 설명, 좌표 및 주소와 같은 위치 세부 정보가 들어있는 Vector 객체를 포함합니다. 여러 개의 결과를 받는 경우, 가장 적절한 결과는 Vector의 첫 번째 색인에 있습니다.
public class MyServerExchangeCallback implements ServerExchangeCallback
{
    public void requestSuccess(ServerExchange exchange)
    {
        if(exchange instanceof GeocodeExchange)
        {
            GeocodeExchange geocodeExchange = (GeocodeExchange)exchange;
            Vector results = geocodeExchange.getResults();
            // Do something with the results
        }
    }
    public void requestFailure(ServerExchange exchange)
    {
        // Inform the user of the failure
    }
    public void requestHalted()
    {
        // Invoked when the request is stopped
    }
}

동기 역 지오코딩 요청 보내기

동기 지오코딩 요청의 경우 프로그램은 ServerExchangeCallback 인터페이스를 구현하지 않아도 됩니다. 동기 지오코딩 요청을 시작하려면 ServerExchangeCallback을 구현하는 클래스에 대한 참조를 전달하는 대신 null을 지정해야 합니다. 동기 지오코딩 요청을 실행할 때에는 요청 결과를 수동으로 확인해야 합니다. 일반적으로 UI 스레드가 아닌 스레드에서 동기 지오코딩 요청을 실행해야 합니다. 그렇지 않으면 사용자는 요청 중에 UI와 상호 작용할 수 없습니다.
GeocodeExchange exchange = Geocoder.getInstance().geocode
        (null, address2, context, 0);
// Check if the request was successful
if(exchange.getExceptionList().size() == 0)
{
    // Do something with the result of the request
}
else
{
    // Inform the user of the failure
}

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.