1. 程式人生 > >谷歌地圖對接記錄(Android)

谷歌地圖對接記錄(Android)

一、背景

對於國內的安卓開發者來說,對谷歌地圖的對接應該是很少見的(國內牆了谷歌,而且國內的手機系統也幾乎都是閹割版安卓系統),大家一般使用百度地圖、高德地圖進行地圖開發。但是總有人會不幸的需要做國外市場的app,需要使用到谷歌地圖,比如我。
鑑於網上很少有教程來詳細講解谷歌地圖的對接,而我在入門瞭解的時候也是過程坎坷。在此記錄下谷歌地圖的一些簡單東西,後續若還有接觸會持續更新。

二、準備工作

如果你使用的是國外的安卓手機,而並非國內各大廠商定製之後的閹割版安卓手機,那麼恭喜你,你開發起來要方便很多。但是如果你身處國內,即使有國外的安卓手機,也還需要能翻牆。

2.1 翻牆

本人也是翻牆小白,就不過多介紹了。本人使用過藍燈免費版和影梭付費版,在手機上安裝對應軟體後開啟翻牆,均能實現效果。國內的網路是無法強呼叫谷歌地圖的api等介面的,所以,在進行除錯開發的時候,手機必須能翻牆。

2.2 谷歌大禮包安裝

之前說了,因為谷歌在國內被牆的原因,國內的安卓手機,幾乎都是閹割版安卓系統,Google Services、Google Store等都是沒有的。而谷歌地圖,需要手機內有這些應用,否則無法使用,如下圖。
這裡寫圖片描述
那麼如何安裝呢?按照網上的說法,要安裝好幾個谷歌應用,還說除了小米手機可以免root在小米手機商店安裝谷歌安裝器小米版,然後這個軟體可以一次性自動安裝好所有谷歌全家桶。
本人是使用本就root了的魅藍手機,在魅族的應用商店內下載安裝了谷歌安裝器魅族專版,然後通過這個app安裝好了谷歌全家桶。所以其他的不是很清楚。
另外,本人遇到的一個小插曲是,在安裝好了谷歌全家桶之後,再次開啟應用,還是出來了類似的提示。提示谷歌服務必須更新才能使用,提示文字的下方顯示了一個更新按鈕,在手機翻牆的情況下,點選更新,自動打開了谷歌商店的app,登入谷歌帳號,自動跳到了升級的介面,進行升級即可。

2.3 谷歌地圖嵌入

谷歌官方介紹
在手機裡面有谷歌對應的服務與app,且手機能訪問外網的情況下。按照如如上網址的谷歌官方文件的入門指南進行開發,且申請了金鑰之後。app在手機內執行的時候能看到打開了地圖,但是介面上沒有任何可操作的東西(除了移動地圖,放大縮小等),也沒有定位到當前位置。這時候可以鬆口氣了,整合的差不多了。

三、谷歌地圖API使用

官方文件和支援,以及使用百度與谷歌搜尋,可以解決我們大部分問題。所以這裡也只是記錄本人使用谷歌地圖時使用到的一個東西,僅作記錄用途。

3.1 定位到當前位置

根據入門介紹,已經在app內集成了谷歌地圖,但是此時沒有定位到當前位置的操作。可以看到程式碼裡面有一個onMapReady的回撥方法,當地圖初始化之後,會進入該方法,我們可以在此方法內做一些基礎操作,比如,顯示地圖自帶的定位到當前位置的功能。

googleMap.setMyLocationEnabled(true); // 開啟定位到當前位置的功能

在onMapReady方法內使用如上程式碼,再次執行app的時候,可以看到在地圖右上角有一個定位按鈕,點選之後就可以定位且顯示到當前位置了。
因為專案中,定位當前位置的按鈕要顯示在左下角且要定製圖示,而且在點選定位的同時還需要做其他操作,所以,我們這裡雖然要開啟定位功能,但是要隱藏右上角的圖示,且要自定義按鈕事件實現定位到當前位置。不顯示右上角圖片的程式碼如下。

googleMap.getUiSettings().setMyLocationButtonEnabled(false); // 右上角不顯示定點陣圖標

在這種情況下,沒有按鈕來點選定位到當前位置。我們需要做的是在進入app的時候就自動定位到當前位置。程式碼如下(也寫在onMapReady方法內):

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
mGoogleApiClient.connect();

該方法有一個回撥方法onConnected,在該方法內我們能拿到定位到的位置,然後呼叫api顯示當前定位出來。如下程式碼,則開啟app之後,定位到當前位置後會記錄當前位置,且移動顯示當前位置。

    @Override
    public void onConnected(Bundle bundle) {
        try {
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        if (mLastLocation != null) {
            latLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latLng.latitude, latLng.longitude), 15));

            Log.i("位置", mLastLocation + "1111111");
            Log.i("位置", "最新的位置 getProvider " + mLastLocation.getProvider());
            Log.i("位置", "最新的位置 getAccuracy " + mLastLocation.getAccuracy());
            Log.i("位置", "最新的位置 getAltitude " + mLastLocation.getAltitude());
            Log.i("位置", "最新的位置 Bearing() " + mLastLocation.getBearing());
            Log.i("位置", "最新的位置 Extras() " + mLastLocation.getExtras());
            Log.i("位置", "最新的位置 Latitude() " + mLastLocation.getLatitude());
            Log.i("位置", "最新的位置 Longitude()() " + mLastLocation.getLongitude());
            Log.i("位置", " =============  ");
        }
        mLocationRequest = LocationRequest.create();
        mLocationRequest.setInterval(5000); //5 seconds
        mLocationRequest.setFastestInterval(3000); //3 seconds
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
            }
        });
    }

使用者如果後續移動了地圖,點選自定義的定位按鈕時,我們使用mGoogleApiClient.reconnect();方法,就可以再次定位且顯示到當前所在位置上了。

定位的時候,手機需要開啟了定位服務。本人沒找到谷歌地圖app那樣的直接開啟定位的方法,所以只能在進行定位之前,判斷當前是否開啟了定位,沒有的話給提示,跳轉到設定裡面讓使用者手動開啟定位許可權(國內大部分應用,包括ofo的app也是如此)。

有一個現象就是,我用魅藍手機測試的時候,開啟定位的時候,會再次彈出是否使用谷歌定位服務,如果選擇否,則還是無法獲取到定位,使用者必須選擇同意使用谷歌定位服務。而在使用國外安卓手機做測試的時候,則沒有這個彈框選擇,開啟定位的時候預設就是使用的谷歌定位服務。

3.2 新增標記

類似於共享單車,在地圖上需要在某些位置上新增標記。如下程式碼,可以為標記設定位置、圖示、標題、描述內容等資訊且新增到地圖內。

mMap.addMarker(new MarkerOptions()
                .position(new LatLng(mLastLocation.getLatitude() + 0.0011111, mLastLocation.getLongitude() + 0.0011111))
                .title("title")
                .snippet("desc")
                .icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marker_gray)));

標記有預設點選事件,點選的時候會在右下角彈出導航圖示,點選之後,若手機內安裝了谷歌地圖會自動開啟谷歌地圖app進行導航,若手機內無谷歌地圖app則會給出相應的提示。我們也可以自定義標記的點選事件,遮蔽掉預設行為。程式碼如下:

        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                // TODO
                return false; // 返回false,點選的時候會將點選標記移至介面中間;true,不移動中心位置
            }
        });

3.3 顯示路線

一般情況下,我們點選某個標記或者位置,要進行導航的時候是跳轉到谷歌地圖,就如預設的方式那樣。由地圖進行專業的導航是最佳的,但是也許你也會遇到這樣的奇葩需求,需要先在自己的app內也能顯示過去的路線(自己app內整合谷歌地圖如何進行導航包括語音,這我就不知道了,那也太變態了),那麼如下工具類能幫到你(網上找的)。

public class GoogleMapUtils {
    /**
     * 通過起點終點,組合成url
     *
     * @param origin
     * @param dest
     * @return
     */
    public static String getDirectionsUrl(LatLng origin, LatLng dest) {

        // Origin of route
        String str_origin = "origin=" + origin.latitude + ","
                + origin.longitude;

        // Destination of route
        String str_dest = "destination=" + dest.latitude + "," + dest.longitude;

        // Sensor enabled
        String sensor = "sensor=false";

        // Travelling Mode
        String mode = "mode=driving";

        //waypoints,116.32885,40.036675
        String waypointLatLng = "waypoints=" + "40.036675" + "," + "116.32885";

        // Building the parameters to the web service
        String parameters = str_origin + "&" + str_dest/* + "&" + sensor + "&"
                + mode + "&" + waypointLatLng*/;

        // Output format
        String output = "json";

        // Building the url to the web service
        String url = "https://maps.googleapis.com/maps/api/directions/"
                + output + "?" + parameters;
        System.out.println("getDerectionsURL--->: " + url);
        return url;
    }

    /**
     * A method to download json data from url
     */
    public static String downloadUrl(String strUrl) throws IOException {
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(strUrl);

            // Creating an http connection to communicate with url
            urlConnection = (HttpURLConnection) url.openConnection();

            // Connecting to url
            urlConnection.connect();

            // Reading data from url
            iStream = urlConnection.getInputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    iStream));

            StringBuffer sb = new StringBuffer();

            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            data = sb.toString();

            br.close();
        } catch (Exception e) {
            Log.e("Excep downloading url", e.toString());
        } finally {
            iStream.close();
            urlConnection.disconnect();
        }
        System.out.println("url:" + strUrl + "---->   downloadurl:" + data);
        return data;
    }

    // Fetches data from url passed
    @SuppressLint("NewApi")
    public static class DownloadTask extends AsyncTask<String, Void, String> {
        // Downloading data in non-ui thread
        @Override
        protected String doInBackground(String... url) {
            // For storing data from web service
            String data = "";
            try {
                // Fetching the data from web service
                data = downloadUrl(url[0]);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        // Executes in UI thread, after the execution of
        // doInBackground()
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            ParserTask parserTask = new ParserTask();

            // Invokes the thread for parsing the JSON data
            parserTask.execute(result);
        }
    }

    /**
     * A class to parse the Google Places in JSON format
     */
    @SuppressLint("NewApi")
    public static class ParserTask extends
            AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

        // Parsing the data in non-ui thread
        @Override
        protected List<List<HashMap<String, String>>> doInBackground(
                String... jsonData) {

            JSONObject jObject;
            List<List<HashMap<String, String>>> routes = null;

            try {
                jObject = new JSONObject(jsonData[0]);
                DirectionsJSONParser parser = new DirectionsJSONParser();

                // Starts parsing data
                routes = parser.parse(jObject);
                System.out.println("do in background:" + routes);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return routes;
        }

        // Executes in UI thread, after the parsing process
        @Override
        protected void onPostExecute(List<List<HashMap<String, String>>> result) {
            ArrayList<LatLng> points = null;
            PolylineOptions lineOptions = null;
            MarkerOptions markerOptions = new MarkerOptions();

            // Traversing through all the routes
            if (null != result) {
                for (int i = 0; i < result.size(); i++) {
                    points = new ArrayList<LatLng>();
                    lineOptions = new PolylineOptions();

                    // Fetching i-th route
                    List<HashMap<String, String>> path = result.get(i);

                    // Fetching all the points in i-th route
                    for (int j = 0; j < path.size(); j++) {
                        HashMap<String, String> point = path.get(j);

                        double lat = Double.parseDouble(point.get("lat"));
                        double lng = Double.parseDouble(point.get("lng"));
                        LatLng position = new LatLng(lat, lng);

                        points.add(position);
                    }

                    // Adding all the points in the route to LineOptions
                    lineOptions.addAll(points);
                    lineOptions.width(Util.dp2px(LBoxApplication.getContext(), 3));

                    // Changing the color polyline according to the mode
                    lineOptions.color(Color.parseColor("#4b98ff"));
                }

                // Drawing polyline in the Google Map for the i-th route
                MainActivity.mMap.addPolyline(lineOptions);
            }
        }
    }
}

使用的時候只需要傳值兩個位置就行,表明從這個位置到另一個位置。

new GoogleMapUtils.DownloadTask().execute(GoogleMapUtils.getDirectionsUrl(new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()),
                    new LatLng(mLastLocation.getLatitude() + 0.00222222, mLastLocation.getLongitude() - 0.00222222)));

該工具類的原理是呼叫谷歌的api介面,根據某些引數查詢路線(程式碼中我註釋掉了一些引數,使用預設值也就是步行的最優方案),然後根據查到的路線的結果呼叫googleMap.addPolyline方法,設定好線的顏色、寬度等即可。在本地測試的時候發現該api訪問較慢。

3.4 主介面的程式碼

目前大概瞭解且實現了,定位、新增標記、地圖上畫線表明如何從當前位置走到指定位置。主要程式碼如下(佈局介面參考官方入門指南):

public class MainActivity extends BaseActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,
        LocationListener, OnMapReadyCallback {

    private Location mLastLocation = null;
    public static GoogleMap mMap;
    public static boolean showRoute = false;

    Marker mCurrLocation;
    LatLng latLng;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(map);
        mapFragment.getMapAsync(this);
    }

    @OnClick({R.id.location_iv})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.location_iv:
                // 重新定位,會重新獲取附近充電寶實況
                mGoogleApiClient.reconnect();
                break;
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(false); // 右上角不顯示定點陣圖標

        mMap.getUiSettings().setMapToolbarEnabled(false); // 點選標記底部右下角不出來控制元件

        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                // TODO
                return false; // 返回false,點選的時候會將點選標記移至介面中間;true,不移動中心位置
            }
        });

        buildGoogleApiClient();

        mGoogleApiClient.connect();
    }

    private void addMarkersToMap() {
        mMap.addMarker(new MarkerOptions()
                .position(new LatLng(mLastLocation.getLatitude() + 0.0011111, mLastLocation.getLongitude() + 0.0011111))
                .title("title")
                .snippet("desc")
                .icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marker_gray)));
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (showRoute) {
            new GoogleMapUtils.DownloadTask().execute(GoogleMapUtils.getDirectionsUrl(new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()),
                    new LatLng(mLastLocation.getLatitude() + 0.00222222, mLastLocation.getLongitude() - 0.00222222)));
            showRoute = false;
        }
    }

    /**
     * * 離開介面時,斷開連線
     */
    @Override
    protected void onStop() {
        super.onStop();
        if (null != mGoogleApiClient && mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    @SuppressLint("NewApi")
    @Override
    public void onConnected(Bundle bundle) {
        try {
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        if (mLastLocation != null) {
            latLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latLng.latitude, latLng.longitude), 15));

            Log.i("位置", mLastLocation + "1111111");
            Log.i("位置", "最新的位置 getProvider " + mLastLocation.getProvider());
            Log.i("位置", "最新的位置 getAccuracy " + mLastLocation.getAccuracy());
            Log.i("位置", "最新的位置 getAltitude " + mLastLocation.getAltitude());
            Log.i("位置", "最新的位置 Bearing() " + mLastLocation.getBearing());
            Log.i("位置", "最新的位置 Extras() " + mLastLocation.getExtras());
            Log.i("位置", "最新的位置 Latitude() " + mLastLocation.getLatitude());
            Log.i("位置", "最新的位置 Longitude()() " + mLastLocation.getLongitude());
            Log.i("位置", " =============  ");
        }
        mLocationRequest = LocationRequest.create();
        mLocationRequest.setInterval(5000); //5 seconds
        mLocationRequest.setFastestInterval(3000); //3 seconds
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
            }
        });
    }

    @Override
    public void onConnectionSuspended(int i) {
        Toast.makeText(this, "onConnectionSuspended", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Toast.makeText(this, "onConnectionFailed", Toast.LENGTH_SHORT).show();
    }

    /**
     * 當位置發生改變
     **/
    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }
}

——20180112
小編又再次來折騰了一回谷歌地圖,這次小編手裡只有一臺華為測試機,老規矩,安裝了翻牆軟體,安裝了谷歌商店,然後谷歌商店中下載安裝了GooglePlay服務和谷歌服務框架。然後,發現改善無法使用該谷歌地圖定位。除錯程式碼發現不支援谷歌位置服務,設定中查詢定位服務,沒看到谷歌位置服務相關的東西。無果,在博主一位前同事的建議下,安裝了谷歌地圖APP,開啟谷歌地圖,定位時會彈出框要求給定位許可權,其中提及到使用谷歌位置服務,此時再去開啟要除錯的APP,發現裡面的谷歌地圖能用了!!!神不神奇?? 可能是國內手機系統遮蔽了該谷歌定位服務?谷歌地圖內部有東西能開啟啟用該服務?博主暫時還唔知……

相關推薦

地圖對接記錄Android

一、背景 對於國內的安卓開發者來說,對谷歌地圖的對接應該是很少見的(國內牆了谷歌,而且國內的手機系統也幾乎都是閹割版安卓系統),大家一般使用百度地圖、高德地圖進行地圖開發。但是總有人會不幸的需要做國外市場的app,需要使用到谷歌地圖,比如我。 鑑於網上很少有

地圖API 學習

google.maps.Marker 1.建立方法 var marker = new google.maps.Marker({   position:pointGGPos,//谷歌地圖經緯

【機器學習】的速成課程

label spa dev 分類 ram 做出 org ron 表示 問題構建 (Framing) 什麽是(監督式)機器學習?簡單來說,它的定義如下: 機器學習系統通過學習如何組合輸入信息來對從未見過的數據做出有用的預測。 標簽 在簡單線性回歸中,標簽是我們要預測

三大核心技術Google BigTable中文版

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

天貓精靈Aligenie對接記錄

天貓精靈Aligenie對接記錄(一) 公司在開發一個智慧家居相關的專案時要對接天貓精靈,分享一下相關經驗,如果想深入交流或者有這方面的需求可以到 https://www.jksxit.com 第一步,建立技能,在Aligenie開發者平臺的控制檯建立技能並填寫相

三大核心技術Google MapReduce中文版

Google MapReduce中文版     譯者: alex 摘要 MapReduce是一個程式設計模型,也是一個處理和生成超大資料集的演算法模型的相關實現。使用者首先建立一個Map函式處理一個基於key/value pair的資料集合,輸出中間的基於key/val

clusterdata-2011-2 叢集資料分析--task_usage

先對 task_usage 即任務資源使用表進行一個分析學習。 task_usage 表共有20列,代表20個屬性,具體每一列代表含義即屬性名稱如下:                       

三大核心技術Google File System中文版

The Google File System中文版 譯者:alex 摘要 我們設計並實現了Google GFS檔案系統,一個面向大規模資料密集型應用的、可伸縮的分散式檔案系統。GFS雖然執行在廉價的普遍硬體裝置上,但是它依然了提供災難冗餘的能力,為大

三大核心技術Google_BigTable中文版

谷歌三大核心技術(三)Google_BigTable中文版 Bigtable:一個分散式的結構化資料儲存系統 譯者:alex 摘要 Bigtable是一個分散式的結構化資料儲存系統,它被設計用來處理海量資料:通常是分佈在數千臺普通伺服器上的PB

clusterdata-2011-2 叢集資料分析

        現在想找這麼一種資料,該作業在每次排程時會以不同的方式執行,例如第一次以並行度為3的方式執行,第二次以並行度為5 的方式執行,然後比較不同並行度下作業的執行時間。         1、

三大核心技術Google File System

We wish to thankt he following people for their contributions to the system or the paper. Brain Bershad (our shepherd) and the anonymous reviewers gave us

Android app呼叫第三方地圖百度地圖,高德地圖地圖導航

因為公司專案需要用到外部導航,找到一些,大兄弟們湊合看...好吧反正也沒人看- - 1.呼叫百度導航 //開啟百度導航 public void startNavi() { //百度地圖,從起點是LatLng ll_location = new La

分享個地圖API實現多標籤多marker,帶分頁

我自己做的還是帶分頁, 程式碼很多,不全貼了,有問題可以問我。 <script type="text/javascript" src="http://www.eju.com/js/global/jquery-1.6.1.min.js"></script&g

H5喚醒本地APP地圖、百度地圖等相通傳遞資料

前一段時間做了一個架設在微信上的打車軟體,司機端是在瀏覽器中開啟,網頁上的導航無法實時定位與語音播報,後因甲方強制要求,必須開啟本地谷歌地圖,並傳入使用者的起點終點,於是翻譯了相關部落格,完美解決,親測可用。 下面說一下相容性問題: IOS:sa

地圖路徑回放動畫的實現總結

//宣告兩個計數變數,分別為路徑的標記的計數var tripCount = 1, markerCount = 1;//宣告兩個變數用來儲存時間迴圈var begin,beginmarker;//預設顯示一個藍色路徑flightPath1 = new google.maps.Polyline({//建立線性疊加

地圖路徑回放動畫的實現

 因為公司有一些特殊的需求,前幾天在做上一個上一個專案的時候,用到了谷歌地圖,路徑回放這個功能再百度地圖和高德地圖是有API直接可以使用的,奈何公司領導只讓用谷歌地圖,搜尋發現網上並無多少相關文章,所以我把我在開發過程中遇到的問題記錄下來,希望能夠幫助大家。我的可能不是最優解

android的入門記錄

下載到本地 可能 安裝 subst 數據 工具包 一次 以及 由於 ---恢復內容開始--- 首先,這是我人生中的第一篇博客,也許嚴格意義上它並不算是一篇博客,但也代表著一些東西。 前言 我們往往在開始學習一門新的語言或者課程時會遇見各式各樣的問題,比

android常犯錯誤記錄

Multiple dex files define Landroid/support/xxx 這個包衝突都是support裡的,比如 Multiple dex files define Landroid/support/v4/app/FragmentTabHost$DummyTabFactory

Android studio3.0對於百度地圖api開發2——百度地圖定位指定地點以及地圖型別的變換

      承接上一篇文章寫的,https://blog.csdn.net/qq_41562408/article/details/82794772已經實現了百度地圖的工具準備以及基本的地圖顯示,不過就一個地圖應用來說,只是單純的顯示一種地圖型別以及只是能夠定位到天安門其他地

Android studio3.0對於百度地圖api開發3——百度地圖定位當前地點以及地圖覆蓋物簡介

   承接上文,上文已經實現了按照緯經度進行地點的定位以及不同地圖型別的切換,https://blog.csdn.net/qq_41562408/article/details/82802082但是就我們普通使用者的需求來說,這遠遠不夠。使用者更希望能夠直接顯示自己的當前位置