[android] J2ME / Android / BlackBerry-운전 경로, 두 위치 간 경로

Android 1.0에는 운전 경로를위한 com.google.googlenav 네임 스페이스가있었습니다.
Route-Google 운전 경로 개선
그러나 최신 SDK에서는 어떤 이유로 제거되었습니다 …
Android : DrivingDirections가 API 1.0 이후 제거됨-1.5에서 수행하는 방법 / 1.6?
블랙 베리에는 그런 것들에 대한 API도 부족
합니다. 블랙 베리에서 두 장소 사이의 경로를 찾는 방법은 무엇입니까?

csie-tw는 해결 방법을 제공합니다 (kml 파일에 대한 gmaps 쿼리 및 구문 분석) : Android-
운전 방향 (경로 경로)
또한 Andrea 는 Android 용 DrivingDirections 도우미 클래스 를 만들었습니다 .
이 기능에 대한 작은 도우미를 j2me에 작성 했으므로 Android와 BlackBerry에서 샘플을 공유하고 싶습니다.

업데이트
댓글에 명시된 바와 같이 공식적으로 Google Maps API 서비스 약관이 허용되지 않습니다 .

Google Maps / Google Earth API 서비스 약관
최종 업데이트 : 2009 년 5 월 27 일

10. 라이센스 제한. 약관에 따라 명시 적으로 허용 된 경우를 제외하고 또는 귀하가 Google (또는 해당되는 경우 특정 콘텐츠 제공 업체로부터)의 사전 서면 승인을받지 않은 경우, 위의 Google 라이선스는 아래의 모든 제한 사항을 준수해야합니다. 섹션 7 또는 Maps API 문서에서 명시 적으로 허용 된 경우를 제외하고 귀하는 다음과 같은 행위를해서는 안됩니다 (다른 사람에게도 허용 할 수 없음).

10.9 다음 과 관련된 제품, 시스템 또는 애플리케이션과 함께 서비스 또는 콘텐츠를 사용해서는 안됩니다.
(a) 실시간 내비게이션 또는 경로 안내 (사용자의 센서 지원 장치의 위치에 동기화되는 단계별 경로 안내 포함)

특정 앱에 대해 비활성화 될 수 있습니다 (어쨌든 적어도 Android에서는) … .NET 대화의 Geocode 스크래핑에서 :

이는 API 이용 약관에 의해 허용되지 않습니다. 지오 코드를 생성하기 위해 Google지도를 긁어서는 안됩니다. 서버의 자동 쿼리를 수행하는 서비스를 차단합니다.

Bret Taylor
제품 관리자, Google지도

대안 및 / 또는 제안에 감사드립니다!
감사!



답변

J2ME 맵 경로 제공자

maps.google.com에는 KML 형식으로 경로 정보를 제공 할 수있는 내비게이션 서비스가 있습니다 .

kml 파일을 얻으려면 시작 및 목적지 위치로 URL을 형성해야합니다.

public static String getUrl(double fromLat, double fromLon,
                            double toLat, double toLon) {// connect to map web service
    StringBuffer urlString = new StringBuffer();
    urlString.append("http://maps.google.com/maps?f=d&hl=en");
    urlString.append("&saddr=");// from
    urlString.append(Double.toString(fromLat));
    urlString.append(",");
    urlString.append(Double.toString(fromLon));
    urlString.append("&daddr=");// to
    urlString.append(Double.toString(toLat));
    urlString.append(",");
    urlString.append(Double.toString(toLon));
    urlString.append("&ie=UTF8&0&om=0&output=kml");
    return urlString.toString();
}

다음으로 xml (SAXParser로 구현 됨)을 구문 분석하고 데이터 구조를 채워야합니다.

public class Point {
    String mName;
    String mDescription;
    String mIconUrl;
    double mLatitude;
    double mLongitude;
}

public class Road {
    public String mName;
    public String mDescription;
    public int mColor;
    public int mWidth;
    public double[][] mRoute = new double[][] {};
    public Point[] mPoints = new Point[] {};
}

네트워크 연결은 Android와 Blackberry에서 다른 방식으로 구현되므로 먼저 URL을 형성해야합니다.

 public static String getUrl(double fromLat, double fromLon,
     double toLat, double toLon)

그런 다음이 URL로 연결을 만들고 InputStream을 가져옵니다.
그런 다음이 InputStream을 전달하고 구문 분석 된 데이터 구조를 가져옵니다.

 public static Road getRoute(InputStream is)

전체 소스 코드 RoadProvider.java

블랙 베리

class MapPathScreen extends MainScreen {
    MapControl map;
    Road mRoad = new Road();
    public MapPathScreen() {
        double fromLat = 49.85, fromLon = 24.016667;
        double toLat = 50.45, toLon = 30.523333;
        String url = RoadProvider.getUrl(fromLat, fromLon, toLat, toLon);
        InputStream is = getConnection(url);
        mRoad = RoadProvider.getRoute(is);
        map = new MapControl();
        add(new LabelField(mRoad.mName));
        add(new LabelField(mRoad.mDescription));
        add(map);
    }
    protected void onUiEngineAttached(boolean attached) {
        super.onUiEngineAttached(attached);
        if (attached) {
            map.drawPath(mRoad);
        }
    }
    private InputStream getConnection(String url) {
        HttpConnection urlConnection = null;
        InputStream is = null;
        try {
            urlConnection = (HttpConnection) Connector.open(url);
            urlConnection.setRequestMethod("GET");
            is = urlConnection.openInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }
}

Google 코드에서 J2MEMapRouteBlackBerryEx 에 대한 전체 코드보기

기계적 인조 인간

Android G1 스크린 샷

public class MapRouteActivity extends MapActivity {
    LinearLayout linearLayout;
    MapView mapView;
    private Road mRoad;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        new Thread() {
            @Override
            public void run() {
                double fromLat = 49.85, fromLon = 24.016667;
                double toLat = 50.45, toLon = 30.523333;
                String url = RoadProvider
                        .getUrl(fromLat, fromLon, toLat, toLon);
                InputStream is = getConnection(url);
                mRoad = RoadProvider.getRoute(is);
                mHandler.sendEmptyMessage(0);
            }
        }.start();
    }

    Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            TextView textView = (TextView) findViewById(R.id.description);
            textView.setText(mRoad.mName + " " + mRoad.mDescription);
            MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
            List<Overlay> listOfOverlays = mapView.getOverlays();
            listOfOverlays.clear();
            listOfOverlays.add(mapOverlay);
            mapView.invalidate();
        };
    };

    private InputStream getConnection(String url) {
        InputStream is = null;
        try {
            URLConnection conn = new URL(url).openConnection();
            is = conn.getInputStream();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

Google 코드에서 J2MEMapRouteAndroidEx 에 대한 전체 코드보기


답변