AndroidマップとGPS機能の実現

25280 ワード

地図とGPSは比較的よく使われる機能で、ネット上ではかなりの例を見つけることができ、同時にいくつかの地図エンジンの会社も地図SDKを開放し、利用することができます.今回はRexseeに基づいて地図ルート制御を実現する機能を重点的に検討し,共有した.同時にRexseeが書いたGPS機能のソースも全部貼ってあるので、ちょっと多いです.見えない自分がRexseeのコミュニティに行く:Rexseeは拡張の中で直接高徳のSDKを使って、協力関係でしょう.高徳地図オブジェクト内の関数で、グーグルマップのようなナビゲーションソフトを簡単に作ることができます.地図プラグインが開いた後、データがプラグインボックスにロードされない前にプラグインを閉じたり、次の戻るキーを押したりすると、プログラムがクラッシュしやすくなります.そのため、プラグインを開くときはキャンセル不可に設定したほうがいいです.RexseeはWebベースの開発であるため,プログラムを全機種自動適合にすることができ,ウィンドウの位置を調整する際に位置に一定の論理を記述する必要がある.もちろん、画面画素の取得方法は異なり、値も異なります.また,平板上には通知欄がないものや,通知欄が下にあるもの,通知欄の高さを減算する必要があるもの,不要なものがある.これはすべて判断する必要がある.もちろんテストの時はこれらを置いて、勝手に1つ設定すればいいです.rexseeMapAbc.start('window-cancelable:false;window-moveable:false;border-width:10px;border-(2*rexseeScreen.getScreenDensityScale()))+';window-modeless:true;window-dim-amount:0;');基本操作には、中心点の設定、位置決め、道路状況も含まれています.道路状況は現在開いていて解消できません..なぜか分からない.高徳地図におけるデータ操作,ナビゲーション操作,興味点操作の戻り値は,いずれも既に配列された形式(EVAL過を前提とする)で出現している,すなわち,ナビゲーション時に複数ある.ナビゲーションには2地の緯度を提供する必要があるので、データ変換中の地名に合わせて目的地情報を取得する関数の方法を使用してください.もちろん緯度範囲を制限したほうがいいです.そうしないと、XX省XX市XX地名などの詳細をスペルしなければなりません.要求されたのは数回のジャンプ回線で、必要に応じてその中の1つを取るか、選択メニューを生成してください.function getRoute(){rexseeMapAbc.hideRoute();var placess=eval('('+prompt('prompt','title=ナビゲーション入力ボックス;message=開始地と目的地を入力してください:;options=開始地:|目的地:|目的地:;defaultValue=北京市北京西駅|北京市北京南駅;inputType=text|text;')+');var startplace=places[ 0];var endplace=places[ 1];var endPlace=places[ 1];var teter tetetetetetetetetes[1];var ter tetetetetetetetetempsp=eval('('+rexseeMapAbc.getAddressFromLocationName(startPlace,1)+')');rexseeMapAbc.requestRoute('routeRequest01',splong,splat,eplong,eplat,role);}  function onRouteReady(id){//alert(rexseeMapAbc.getRequesedRoute(id));var temps=rexseeMapAbc.getRequestedRoute(id);//temps = temps.replace(/\r","");//alert(temps);rexseeMapAbc.showRoute(id,0)}興味点の制御とルート制御は同じで、興味点を閉じると地図上のナビゲーション線も一緒に消えます.高徳地図はGPSに合わせて使用する場合、国の基準に従ってオフセットする必要がありますので、オフセットしてから(対象に対応する関数がある)位置決めしてください.そうしないと偏差があります.また、パラメータとして緯度を指定する場合は、文字列に変換してください.そうしないと、偏差が大きくなります.最後にRexseeが書いたオリジナルGPSソースですが、オリジナルを作るにはこれを直接見ることができます.
Java code

  
/* * Copyright (C) 2011 The Rexsee Open Source Project * * You may obtain a copy of the License at * * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * limitations under the License. */ package rexsee.location; import java.util.List; import rexsee.core.browser.JavascriptInterface; import rexsee.core.browser.RexseeBrowser; import rexsee.core.browser.ActivityResult.ActivityResultListener; mport android.os.Bundle; import android.provider.Settings; public class RexseeGps implements JavascriptInterface { private static final String INTERFACE_NAME = " Gps " ; @Override public String getInterfaceName() { return mBrowser.application.resources.prefix + INTERFACE_NAME; } @Override public static final String EVENT_ONGPSLOCATIONCHANGED = " onGpsLocationChanged " ; public static String address2Json(Address address) { if (address == null ) return " {} " ; String rtn = "" ; rtn += " { " ; rtn += " \"Premises\":\" " + address.getPremises() + " \" " ; // Type of the location. Cross, road or POI. // rtn += ",\"SubLocality\":\"" + address.getSubLocality() + "\"";Not support SDK3 rtn += " ,\"Thoroughfare\":\" " + address.getThoroughfare() + " \" " ; rtn += " } " ; return rtn; } public static String addresses2Json(List < Address > addresses) { String rtn = " [ " ; for ( int i = 0 ; i < addresses.size(); i ++ ) { if (i != 0 ) rtn += " , " ; } private int minUpdateDuration = 60 ; public RexseeGps( final RexseeBrowser browser) { mContext = browser.getContext(); mBrowser = browser; browser.eventList.add(EVENT_ONGPSSETTINGSUCCESSED); public void run() { stop(); } }); mListener = new LocationListener() { @Override public void onLocationChanged(Location location) { if (browser != null ) { browser.eventList.run(EVENT_ONGPSLOCATIONCHANGED, new String[]{ } @Override public void onProviderDisabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } } }; } // JavaScript Interface public boolean isReady() { return (((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).isProviderEnabled(LocationManager.GPS_PROVIDER)) ? true : false ; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minUpdateDuration * 1000 , minUpdateDistance, mListener); } else { mBrowser.exception(getInterfaceName(), " GPS is not available. " ); } } public void stop() { } public void setMinimumUpdateDuration( int seconds) { minUpdateDuration = seconds; } public void setMinimumUpdateDistance( int meter) { minUpdateDistance = meter; } } public String getLastKnownLocation() { if ( ! isReady()) return " {} " ; try { Location location = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location == null ) return "" ; return rtn; } catch (Exception e) { mBrowser.exception(getInterfaceName(), e); return " {} " ; } } public String getLastKnownGeo( int maxNumber) { if ( ! isReady()) return " [] " ; try { Location location = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getLastKnownLocation(LocationManager.GPS_PROVIDER); (), location.getLongitude(), maxNumber); return addresses2Json(addresses); } catch (IOException e) { mBrowser.exception(getInterfaceName(), e); return " [] " ; } } public float getDistanceBetween(String startLongitude, String startLatitude, String endLongitude, String endLatitude) { Location.distanceBetween(sLatitude, sLongitude, eLatitude, eLongitude, results); return results[ 0 ]; } }