Android地图应用新视界--mapbox的应用开发之简单功能提取篇

2024-06-01 08:08

本文主要是介绍Android地图应用新视界--mapbox的应用开发之简单功能提取篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇-Android地图应用新视界--mapbox的应用开发之初始集成篇-中介绍了全球应用的多平台地图框架mapbox在Android端的集成步骤,此篇将延续上篇内容,主要提取一些简单的常用方法,开发者可以藉此做简单开发


如下:


目前开发者账户公共令牌:
pk.eyJ1IjoiamFja3l6IiwiYSI6ImNpb2pxbzJrbjAxeWp2MW0zNXNpcDhscDIifQ.TbKXdF03rKa1RUvxeqiCTw
申请令牌:


在MapboxGLAndroidSDKTestApp的AndroidManifest.xml中设置
<meta-data
            android:name="com.mapbox.AccessToken"
            android:value="" />(将这个码“XXX”写入value中)
在res/values/developer-config.xml中按上述步骤设置AccessToken的值

获取token令牌
public static String getMapboxAccessToken(@NonNull Context context) {
try {
// Read out AndroidManifest
PackageManager packageManager = context.getPackageManager();
ApplicationInfo appInfo = packageManager
.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
String token = appInfo.metaData.getString(MapboxConstants.KEY_META_DATA_MANIFEST);
if (token == null || token.isEmpty()) {
throw new IllegalArgumentException();
}
return token;
} catch (Exception e) {
// Use fallback on string resource, used for development
int tokenResId = context.getResources()
.getIdentifier("mapbox_access_token", "string", context.getPackageName());
return tokenResId != 0 ? context.getString(tokenResId) : null;
}
}



mapbox 内置风格
  • Mapbox Streets我们的标志性风格。阅读博客文章以获得更多关于这种风格的移动具体考虑。
  • Emerald大交通和户外地形。了解更多有关数据源
  • Light and Dark轻型和深色风格,是伟大的数据覆盖。用他们日夜模式,底图明亮数据之上,而更多
  • Satellite and Satellite Streets最好看,最准确,最先进最新的卫星图像提供的任何地方。看看我们的博客了解最新信息,我们最先进的技术和数据。
  • Hybrid混合型 不显眼的标签,上面的卫星式的,便于寻路的道路。
  • 置换方式
    mapView.setStyle(Style.MAPBOX_STREETS);
    mapboxMap.setStyleUrl(Style.SATELLITE_STREETS);
    ---------------------------------------------------------------------------------------------
    下载mapbox-光栅v8.json,打开它,取代mapbox.streets你userid.mapid,并将其添加到您的应用程序的资产目录或文件上传到服务器
    这种技术可以加载任何自定义样式的JSON符合Mapbox GL样式规格
    mapView.setStyleUrl("https://www.mapbox.com/android-sdk/files/mapbox-raster-v8.json");




悬浮的button:
compile 'com.android.support:design:23.2.0'

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_map" />


绘制一个标记
           
@Override
public void onMapReady(MapboxMap mapboxMap) {
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(48.13863, 11.57603))
.title("Hello World!")
.snippet("Welcome to my marker."));
}

绘制自定义图片标记
(可以mapboxMap.addMarkers然后实现一大堆方法 待研究)
             
@Override
public void onMapReady(MapboxMap mapboxMap) {
// Create an Icon object for the marker to use
IconFactory iconFactory = IconFactory.getInstance(MainActivity.this);
Drawable iconDrawable = ContextCompat.getDrawable(MainActivity.this, R.drawable.purple_marker);
Icon icon = iconFactory.fromDrawable(iconDrawable);
// Add the custom icon marker to the map
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(-33.8500000, 18.4158234))
.title("Cape Town Harbour")
.snippet("One of the busiest ports in South Africa")
.icon(icon));
}
});
参考样式:
(//mapbox:access_token="<your access token here>" mapbox:style_url="mapbox://styles/mapbox/outdoors-v9")
mapboxmao--ZOOM 变焦范围为0.0-21.0


在配置文件配置
           
mapbox:style_url="@string/style_light"
mapbox:center_latitude="39.885"
mapbox:center_longitude="116.679"
mapbox:zoom="12"//变焦
mapbox:tilt="20"//倾斜度                                                                                                              


设置动画/自定义地图边界包含poi兴趣点
           
// When user clicks the map, animate to new camera location
mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() {
@Override
public void onMapClick(@NonNull LatLng point) {
                        CameraPosition position = new CameraPosition.Builder()
.target(new LatLng(51.50550, -0.07520)) // Sets the new camera position
.zoom(17) // Sets the zoom
.bearing(180) // Rotate the camera
.tilt(30) // Set the camera tilt
.build(); // Creates a CameraPosition from the builder
                        mapboxMap.animateCamera(CameraUpdateFactory
.newCameraPosition(position), 7000);
}
});


边界包含poi兴趣点/标记点
@Override
public void onMapReady(final MapboxMap mapboxMap) {
final Marker marker1 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.848380, 174.762275)).title("Sky Tower"));
final Marker marker2 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.847179, 174.777072)).title("Vector Arena"));
final Marker marker3 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.801887, 175.108709)).title("Waiheke Island"));
final Marker marker4 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.835059, 174.691237)).title("Waitemata Harbour"));
// When user clicks the map, animate to new camera location
mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() {
@Override
public void onMapClick(@NonNull LatLng point) {
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(marker1.getPosition())
.include(marker2.getPosition())
.include(marker3.getPosition())
.include(marker4.getPosition())
.build();
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 50));
}
});
}

来源: https://www.mapbox.com/android-sdk/examples/animate-camera/



点击监听--设定地点地图跳转 
public void dosomething(final MapboxMap mapboxMap) {
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(41.327752, 19.818666)) // Sets the center of the map to the specified location
.zoom(13)                            // Sets the zoom level
.build();
//set the user's viewpoint as specified in the cameraPosition object
mapboxMap. moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
//Add a marker to the map in the specified location
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(41.327752, 19.818666))
.title("MapBox Marker!")
.snippet("Welcome to my marker."));
}
});
}



绘制geojson线/画图形
new DrawGeoJSON().execute();
private class DrawGeoJSON extends AsyncTask<Void, Void, List<LatLng>> {
@Override
protected List<LatLng> doInBackground(Void... voids) {
ArrayList<LatLng> points = new ArrayList<>();
try {
// Load GeoJSON file
InputStream inputStream = getAssets().open("example.geojson");
BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
inputStream.close();
// Parse JSON
JSONObject json = new JSONObject(sb.toString());
JSONArray features = json.getJSONArray("features");
JSONObject feature = features.getJSONObject(0);
JSONObject geometry = feature.getJSONObject("geometry");
if (geometry != null) {
String type = geometry.getString("type");
// Our GeoJSON only has one feature: a line string
if (!TextUtils.isEmpty(type) && type.equalsIgnoreCase("LineString")) {
// Get the Coordinates
JSONArray coords = geometry.getJSONArray("coordinates");
for (int lc = 0; lc < coords.length(); lc++) {
JSONArray coord = coords.getJSONArray(lc);
LatLng latLng = new LatLng(coord.getDouble(1), coord.getDouble(0));
points.add(latLng);
}
}
}
} catch (Exception e) {
Log.e(TAG, "Exception Loading GeoJSON: " + e.toString());
}
return points;
}
@Override
protected void onPostExecute(List<LatLng> points) {
super.onPostExecute(points);
if (points.size() > 0) {
LatLng[] pointsArray = points.toArray(new LatLng[points.size()]);
// Draw Points on MapView
mapboxMap.addPolyline(new PolylineOptions()
.add(pointsArray)
.color(Color.parseColor("#3bb2d0"))
.width(2));
}
}
}

画一个图形图层
private void drawPolygon(MapboxMap mapboxMap) {
List<LatLng> polygon = new ArrayList<>();
polygon.add(new LatLng(45.522585, -122.685699));
polygon.add(new LatLng(45.534611, -122.708873));
polygon.add(new LatLng(45.530883, -122.678833));
polygon.add(new LatLng(45.547115, -122.667503));
polygon.add(new LatLng(45.530643, -122.660121));
polygon.add(new LatLng(45.533529, -122.636260));
polygon.add(new LatLng(45.521743, -122.659091));
polygon.add(new LatLng(45.510677, -122.648792));
polygon.add(new LatLng(45.515008, -122.664070));
polygon.add(new LatLng(45.502496, -122.669048));
polygon.add(new LatLng(45.515369, -122.678489));
polygon.add(new LatLng(45.506346, -122.702007));
polygon.add(new LatLng(45.522585, -122.685699));
        mapboxMap.addPolygon(new PolygonOptions()
.addAll(polygon)
.fillColor(Color.parseColor("#3bb2d0")));
}


实现定位功能:
新版4.0.1定位实现
mapboxMap. setAccessToken(MAPBOX_ACCESS_TOKEN);
getMyLocationTest();


private void getMyLocationTest() {
mapboxMap.setMyLocationEnabled(true);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(mapboxMap.getMyLocation().getLatitude(), mapboxMap.getMyLocation().getLongitude())) // Sets the               center of the map to the specified location
.zoom(13)                            // Sets the zoom level
.build();
//set the user's viewpoint as specified in the cameraPosition object
mapboxMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}



private LocationManager locationManager;
public void getMyLocation() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// 获取所有可用的位置提供器
List<String> providerList = locationManager.getProviders(true);
String provider;
if (providerList.contains(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
} else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
} else {
// 当没有可用的位置提供器时,弹出Toast提示用户
Toast.makeText(this, "No location provider to use",
Toast.LENGTH_SHORT).show();
return;
}
Log.e("location", provider);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
//    ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
//   public void onRequestPermissionsResult(int requestCode, String[] permissions,
//                                          int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
// 显示当前设备的位置信息
showLocation(location);
}
locationManager.requestLocationUpdates(provider, 5000, 1, locationListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
if (locationManager != null) {
// 关闭程序时将监听器移除
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
//    ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
//   public void onRequestPermissionsResult(int requestCode, String[] permissions,
//                                          int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.removeUpdates(locationListener);
}
}
LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle
extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(Location location) {
// 更新当前设备的位置信息
showLocation(location);
}
};
private void showLocation(Location location) {
String currentPosition = "latitude is " + location.getLatitude() + "\n"
+ "longitude is " + location.getLongitude();
Log.e("location",currentPosition);
}
在2014demo中:
private void myLocation(MapboxMap mapboxMap) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mapboxMap.setMyLocationEnabled(true);
//        mapboxMap.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW);//持续跟踪
mapboxMap.getMyLocation();
}



在地图中显示方向-绘制路线
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(MapboxMap mapboxMap) {
map = mapboxMap;
// Add origin and destination to the map
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(origin.getLatitude(), origin.getLongitude()))
.title("Origin")
.snippet("Alhambra"));
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(destination.getLatitude(), destination.getLongitude()))
.title("Destination")
.snippet("Plaza del Triunfo"));
// Get route from API
try {
getRoute(origin, destination);
} catch (ServicesException e) {
e.printStackTrace();
}
}
});


private void  getRoute(Position origin, Position destination) throws ServicesException {
MapboxDirections client = new MapboxDirections.Builder()
.setOrigin(origin)
.setDestination(destination)
.setProfile(DirectionsCriteria.PROFILE_CYCLING)
.setAccessToken("<your access token here>")
.build();
client.enqueueCall(new Callback<DirectionsResponse>() {
@Override
public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
// You can get the generic HTTP info about the response
Log.d(TAG, "Response code: " + response.code());
if (response.body() == null) {
Log.e(TAG, "No routes found, make sure you set the right user and access token.");
return;
}
// Print some info about the route
currentRoute = response.body().getRoutes().get(0);
Log.d(TAG, "Distance: " + currentRoute.getDistance());
Toast.makeText(MainActivity.this, "Route is " +  currentRoute.getDistance() + " meters long.", Toast.LENGTH_SHORT).show();
// Draw the route on the map
drawRoute(currentRoute);
}
@Override
public void onFailure(Call<DirectionsResponse> call, Throwable t) {
Log.e(TAG, "Error: " + t.getMessage());
Toast.makeText(MainActivity.this, "Error: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void  drawRoute(DirectionsRoute route) {
// Convert LineString coordinates into LatLng[]
LineString lineString = LineString.fromPolyline(route.getGeometry(), Constants.OSRM_PRECISION_V5);
List<Position> coordinates = lineString.getCoordinates();
LatLng[] points = new LatLng[coordinates.size()];
for (int i = 0; i < coordinates.size(); i++) {
points[i] = new LatLng(
coordinates.get(i).getLatitude(),
coordinates.get(i).getLongitude());
}
// Draw Points on MapView
map.addPolyline(new PolylineOptions()
.add(points)
.color(Color.parseColor("#009688"))
.width(5));
}




长按绘制路线
private void longclick(final MapboxMap mapboxMap) {
mapboxMap.setOnMapLongClickListener(new MapboxMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng point) {
//删除所有之前的标记
mapboxMap.removeAnnotations();
// Set the origin waypoint to the devices location设置初始位置
Waypoint origin = new Waypoint(mapboxMap.getMyLocation().getLongitude(), mapboxMap.getMyLocation().getLatitude());
// 设置目的地路径--点击的位置点
Waypoint destination = new Waypoint(point.getLongitude(), point.getLatitude());
// Add marker to the destination waypoint
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(point))
.title("目的地")
.snippet("My destination"));
// Get route from API
getRoute(origin, destination);
}
});
}



private void getRoute(Waypoint origin, Waypoint destination) {
MapboxDirections directions = new MapboxDirections.Builder()
.setAccessToken(MAPBOX_ACCESS_TOKEN)
.setOrigin(origin)
.setDestination(destination)
.setProfile(DirectionsCriteria.PROFILE_WALKING)
.build();
directions.enqueue(new Callback<DirectionsResponse>() {
@Override
public void onResponse(Response<DirectionsResponse> response, Retrofit retrofit) {
// Print some info about the route
currentRoute = response.body().getRoutes().get(0);
showToastMessage(String.format("You are %d meters \nfrom your destination", currentRoute.getDistance()));
// Draw the route on the map
drawRoute(currentRoute);
}
@Override
public void onFailure(Throwable t) {
showToastMessage("Error: " + t.getMessage());
}
});
}
private void showToastMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
private void drawRoute(DirectionsRoute route) {
// Convert List<Waypoint> into LatLng[]
List<Waypoint> waypoints = route.getGeometry().getWaypoints();
LatLng[] point = new LatLng[waypoints.size()];
for (int i = 0; i < waypoints.size(); i++) {
point[i] = new LatLng(
waypoints.get(i).getLatitude(),
waypoints.get(i).getLongitude());
}
// Draw Points on MapView
mapboxMap.addPolyline(new PolylineOptions()
.add(point)
.color(Color.parseColor("#38afea"))
.width(5));
}



地理位置搜索功能
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mas_geocoding);
// Set up the MapView
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(MapboxMap mapboxMap) {
map = mapboxMap;
}
});
// Set up autocomplete widget
GeocoderAutoCompleteView autocomplete = (GeocoderAutoCompleteView) findViewById(R.id.query);
autocomplete. setAccessToken( MapboxAccountManager.getInstance().getAccessToken());
autocomplete. setType(GeocodingCriteria.TYPE_POI);
autocomplete. setOnFeatureListener(new GeocoderAutoCompleteView.OnFeatureListener() {
@Override
public void  OnFeatureClick(GeocodingFeature feature) {
Position position = feature.asPosition();
updateMap(position.getLatitude(), position.getLongitude());
}
});
}
private void  updateMap(double latitude, double longitude) {
// Build marker
map.addMarker(new MarkerOptions()
.position(new LatLng(latitude, longitude))
.title("Geocoder result"));
//跳转目的地界面
// Animate camera to geocoder result location
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(latitude, longitude))
.zoom(15)
.build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 5000, null);
}


下载静态地图
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mas_static_image);
ImageView imageView = (ImageView) findViewById(R.id.mapImage);
MapboxStaticImage staticImage;
try {
staticImage = new MapboxStaticImage.Builder()
.setAccessToken(MapboxAccountManager.getInstance().getAccessToken())
.setUsername(Constants.MAPBOX_USER)
.setStyleId(Constants.MAPBOX_STYLE_SATELLITE)
.setLon(12.3378) // Image center longitude
.setLat(45.4338) // Image center Latitude
.setZoom(13)
.setWidth(640) // Image width
.setHeight(360) // Image height
.setRetina(true) // Retina 2x image will be returned
.build();
new DownloadImageTask(imageView).execute(staticImage.getUrl().toString());
} catch (ServicesException e) {
Log.e(TAG, "MapboxStaticImage error: " + e.getMessage());
e.printStackTrace();
}
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView imageView;
public DownloadImageTask(ImageView imageView) {
this.imageView = imageView;
}
protected Bitmap doInBackground(String... urls) {
// Create OkHttp object
final OkHttpClient client = new OkHttpClient();
// Build request
Request request = new Request.Builder()
.url(urls[0])
.build();
Response response = null;
Bitmap bitmap = null;
try {
// Make request
response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
// If the response is successful,
// create the static map image
if (response.isSuccessful()) {
try {
bitmap = BitmapFactory.decodeStream(response.body().byteStream());
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
}
return bitmap;
}
protected void onPostExecute(Bitmap result) {
// Add static map image to imageView
imageView.setImageBitmap(result);
}
}

 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_offline_simple);
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
// Set up the OfflineManager
offlineManager = OfflineManager.getInstance(this);
offlineManager.setAccessToken(MapboxAccountManager.getInstance().getAccessToken());
// Create a bounding box for the offline region
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(new LatLng(37.7897, -119.5073)) // Northeast
.include(new LatLng(37.6744, -119.6815)) // Southwest
.build();
// Define the offline region
OfflineTilePyramidRegionDefinition definition = new OfflineTilePyramidRegionDefinition(
mapView.getStyleUrl(),
latLngBounds,
10,
20,
this.getResources().getDisplayMetrics().density);
// Set the metadata
byte[] metadata;
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put(JSON_FIELD_REGION_NAME, "Yosemite National Park");
String json = jsonObject.toString();
metadata = json.getBytes(JSON_CHARSET);
} catch (Exception e) {
Log.e(TAG, "Failed to encode metadata: " + e.getMessage());
metadata = null;
}
// Create the region asynchronously
offlineManager.createOfflineRegion(definition, metadata, new OfflineManager.CreateOfflineRegionCallback() {
@Override
public void onCreate(OfflineRegion offlineRegion) {
offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE);
// Display the download progress bar
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
startProgress();
// Monitor the download progress using setObserver
offlineRegion.setObserver(new OfflineRegion.OfflineRegionObserver() {
@Override
public void onStatusChanged(OfflineRegionStatus status) {
// Calculate the download percentage and update the progress bar
double percentage = status.getRequiredResourceCount() >= 0 ?
(100.0 * status.getCompletedResourceCount() / status.getRequiredResourceCount()) :
0.0;
if (status.isComplete()) {
// Download complete
endProgress("Region downloaded successfully.");
} else if (status.isRequiredResourceCountPrecise()) {
// Switch to determinate state
setPercentage((int) Math.round(percentage));
}
}
@Override
public void onError(OfflineRegionError error) {
// If an error occurs, print to logcat
Log.e(TAG, "onError reason: " + error.getReason());
Log.e(TAG, "onError message: " + error.getMessage());
}
@Override
public void mapboxTileCountLimitExceeded(long limit) {
// Notify if offline region exceeds maximum tile count
Log.e(TAG, "Mapbox tile count limit exceeded: " + limit);
}
});
}
@Override
public void onError(String error) {
Log.e(TAG, "Error: " + error);
}
});
}
@Override
public void onResume() {
super.onResume();
mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
@Override
public void onList(OfflineRegion[] offlineRegions) {
// delete the last item in the offlineRegions list which will be yosemite offline map
offlineRegions[(offlineRegions.length - 1)].delete(new OfflineRegion.OfflineRegionDeleteCallback() {
@Override
public void onDelete() {
Toast.makeText(SimpleOfflineMapActivity.this, "Yosemite offline map deleted", Toast.LENGTH_LONG).show();
}
@Override
public void onError(String error) {
Log.e(TAG, "On Delete error: " + error);
}
});
}
@Override
public void onError(String error) {
Log.e(TAG, "onListError: " + error);
}
});
}




// Progress bar methods
private void startProgress() {
// Start and show the progress bar
isEndNotified = false;
progressBar.setIndeterminate(true);
progressBar.setVisibility(View.VISIBLE);
}
private void setPercentage(final int percentage) {
progressBar.setIndeterminate(false);
progressBar.setProgress(percentage);
}
private void endProgress(final String message) {
// Don't notify more than once
if (isEndNotified) return;
// Stop and hide the progress bar
isEndNotified = true;
progressBar.setIndeterminate(false);
progressBar.setVisibility(View.GONE);
// Show a toast
Toast.makeText(SimpleOfflineMapActivity.this, message, Toast.LENGTH_LONG).show();
}




目前开发者账户公共令牌:
pk.eyJ1IjoiamFja3l6IiwiYSI6ImNpb2pxbzJrbjAxeWp2MW0zNXNpcDhscDIifQ.TbKXdF03rKa1RUvxeqiCTw
申请令牌:
pk.eyJ1IjoiamFja3l6IiwiYSI6ImNpb2w3OTlmdDAwNzd1Z20weG42MjF5dmMifQ.775C4o6elT5la-uuMjJe4w


在MapboxGLAndroidSDKTestApp的AndroidManifest.xml中设置
<meta-data
            android:name="com.mapbox.AccessToken"
            android:value="" />(将这个码“XXX”写入value中)
在res/values/developer-config.xml中按上述步骤设置AccessToken的值

获取token令牌
public static String getMapboxAccessToken(@NonNull Context context) {
try {
// Read out AndroidManifest
PackageManager packageManager = context.getPackageManager();
ApplicationInfo appInfo = packageManager
.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
String token = appInfo.metaData.getString(MapboxConstants.KEY_META_DATA_MANIFEST);
if (token == null || token.isEmpty()) {
throw new IllegalArgumentException();
}
return token;
} catch (Exception e) {
// Use fallback on string resource, used for development
int tokenResId = context.getResources()
.getIdentifier("mapbox_access_token", "string", context.getPackageName());
return tokenResId != 0 ? context.getString(tokenResId) : null;
}
}



mapbox 内置风格
  • Mapbox Streets我们的标志性风格。阅读博客文章以获得更多关于这种风格的移动具体考虑。
  • Emerald大交通和户外地形。了解更多有关数据源
  • Light and Dark轻型和深色风格,是伟大的数据覆盖。用他们日夜模式,底图明亮数据之上,而更多
  • Satellite and Satellite Streets最好看,最准确,最先进最新的卫星图像提供的任何地方。看看我们的博客了解最新信息,我们最先进的技术和数据。
  • Hybrid混合型 不显眼的标签,上面的卫星式的,便于寻路的道路。
  • 置换方式
    mapView.setStyle(Style.MAPBOX_STREETS);
    mapboxMap.setStyleUrl(Style.SATELLITE_STREETS);
    ---------------------------------------------------------------------------------------------
    下载mapbox-光栅v8.json,打开它,取代mapbox.streets你userid.mapid,并将其添加到您的应用程序的资产目录或文件上传到服务器
    这种技术可以加载任何自定义样式的JSON符合Mapbox GL样式规格
    mapView.setStyleUrl("https://www.mapbox.com/android-sdk/files/mapbox-raster-v8.json");




悬浮的button:
compile 'com.android.support:design:23.2.0'

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_map" />


绘制一个标记
         
@Override
public void onMapReady(MapboxMap mapboxMap) {
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(48.13863, 11.57603))
.title("Hello World!")
.snippet("Welcome to my marker."));
}

绘制自定义图片标记
(可以mapboxMap.addMarkers然后实现一大堆方法 待研究)
           
@Override
public void onMapReady(MapboxMap mapboxMap) {
// Create an Icon object for the marker to use
IconFactory iconFactory = IconFactory.getInstance(MainActivity.this);
Drawable iconDrawable = ContextCompat.getDrawable(MainActivity.this, R.drawable.purple_marker);
Icon icon = iconFactory.fromDrawable(iconDrawable);
// Add the custom icon marker to the map
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(-33.8500000, 18.4158234))
.title("Cape Town Harbour")
.snippet("One of the busiest ports in South Africa")
.icon(icon));
}
});
参考样式:
(//mapbox:access_token="<your access token here>" mapbox:style_url="mapbox://styles/mapbox/outdoors-v9")
mapboxmao--ZOOM 变焦范围为0.0-21.0


在配置文件配置
         
mapbox:style_url="@string/style_light"
mapbox:center_latitude="39.885"
mapbox:center_longitude="116.679"
mapbox:zoom="12"//变焦
mapbox:tilt="20"//倾斜度                                                                                                              


设置动画/自定义地图边界包含poi兴趣点
         
// When user clicks the map, animate to new camera location
mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() {
@Override
public void onMapClick(@NonNull LatLng point) {
                        CameraPosition position = new CameraPosition.Builder()
.target(new LatLng(51.50550, -0.07520)) // Sets the new camera position
.zoom(17) // Sets the zoom
.bearing(180) // Rotate the camera
.tilt(30) // Set the camera tilt
.build(); // Creates a CameraPosition from the builder
                        mapboxMap.animateCamera(CameraUpdateFactory
.newCameraPosition(position), 7000);
}
});


边界包含poi兴趣点/标记点
@Override
public void onMapReady(final MapboxMap mapboxMap) {
final Marker marker1 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.848380, 174.762275)).title("Sky Tower"));
final Marker marker2 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.847179, 174.777072)).title("Vector Arena"));
final Marker marker3 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.801887, 175.108709)).title("Waiheke Island"));
final Marker marker4 = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-36.835059, 174.691237)).title("Waitemata Harbour"));
// When user clicks the map, animate to new camera location
mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() {
@Override
public void onMapClick(@NonNull LatLng point) {
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(marker1.getPosition())
.include(marker2.getPosition())
.include(marker3.getPosition())
.include(marker4.getPosition())
.build();
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 50));
}
});
}

来源: https://www.mapbox.com/android-sdk/examples/animate-camera/



点击监听--设定地点地图跳转 
public void dosomething(final MapboxMap mapboxMap) {
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(41.327752, 19.818666)) // Sets the center of the map to the specified location
.zoom(13)                            // Sets the zoom level
.build();
//set the user's viewpoint as specified in the cameraPosition object
mapboxMap. moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
//Add a marker to the map in the specified location
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(41.327752, 19.818666))
.title("MapBox Marker!")
.snippet("Welcome to my marker."));
}
});
}



绘制geojson线/画图形
new DrawGeoJSON().execute();
private class DrawGeoJSON extends AsyncTask<Void, Void, List<LatLng>> {
@Override
protected List<LatLng> doInBackground(Void... voids) {
ArrayList<LatLng> points = new ArrayList<>();
try {
// Load GeoJSON file
InputStream inputStream = getAssets().open("example.geojson");
BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
inputStream.close();
// Parse JSON
JSONObject json = new JSONObject(sb.toString());
JSONArray features = json.getJSONArray("features");
JSONObject feature = features.getJSONObject(0);
JSONObject geometry = feature.getJSONObject("geometry");
if (geometry != null) {
String type = geometry.getString("type");
// Our GeoJSON only has one feature: a line string
if (!TextUtils.isEmpty(type) && type.equalsIgnoreCase("LineString")) {
// Get the Coordinates
JSONArray coords = geometry.getJSONArray("coordinates");
for (int lc = 0; lc < coords.length(); lc++) {
JSONArray coord = coords.getJSONArray(lc);
LatLng latLng = new LatLng(coord.getDouble(1), coord.getDouble(0));
points.add(latLng);
}
}
}
} catch (Exception e) {
Log.e(TAG, "Exception Loading GeoJSON: " + e.toString());
}
return points;
}
@Override
protected void onPostExecute(List<LatLng> points) {
super.onPostExecute(points);
if (points.size() > 0) {
LatLng[] pointsArray = points.toArray(new LatLng[points.size()]);
// Draw Points on MapView
mapboxMap.addPolyline(new PolylineOptions()
.add(pointsArray)
.color(Color.parseColor("#3bb2d0"))
.width(2));
}
}
}

画一个图形图层
private void drawPolygon(MapboxMap mapboxMap) {
List<LatLng> polygon = new ArrayList<>();
polygon.add(new LatLng(45.522585, -122.685699));
polygon.add(new LatLng(45.534611, -122.708873));
polygon.add(new LatLng(45.530883, -122.678833));
polygon.add(new LatLng(45.547115, -122.667503));
polygon.add(new LatLng(45.530643, -122.660121));
polygon.add(new LatLng(45.533529, -122.636260));
polygon.add(new LatLng(45.521743, -122.659091));
polygon.add(new LatLng(45.510677, -122.648792));
polygon.add(new LatLng(45.515008, -122.664070));
polygon.add(new LatLng(45.502496, -122.669048));
polygon.add(new LatLng(45.515369, -122.678489));
polygon.add(new LatLng(45.506346, -122.702007));
polygon.add(new LatLng(45.522585, -122.685699));
        mapboxMap.addPolygon(new PolygonOptions()
.addAll(polygon)
.fillColor(Color.parseColor("#3bb2d0")));
}




 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 



 
 




实现定位功能:
新版4.0.1定位实现
mapboxMap. setAccessToken(MAPBOX_ACCESS_TOKEN);
getMyLocationTest();


private void getMyLocationTest() {
mapboxMap.setMyLocationEnabled(true);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(mapboxMap.getMyLocation().getLatitude(), mapboxMap.getMyLocation().getLongitude())) // Sets the               center of the map to the specified location
.zoom(13)                            // Sets the zoom level
.build();
//set the user's viewpoint as specified in the cameraPosition object
mapboxMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}



private LocationManager locationManager;
public void getMyLocation() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// 获取所有可用的位置提供器
List<String> providerList = locationManager.getProviders(true);
String provider;
if (providerList.contains(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
} else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
} else {
// 当没有可用的位置提供器时,弹出Toast提示用户
Toast.makeText(this, "No location provider to use",
Toast.LENGTH_SHORT).show();
return;
}
Log.e("location", provider);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
//    ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
//   public void onRequestPermissionsResult(int requestCode, String[] permissions,
//                                          int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
// 显示当前设备的位置信息
showLocation(location);
}
locationManager.requestLocationUpdates(provider, 5000, 1, locationListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
if (locationManager != null) {
// 关闭程序时将监听器移除
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
//    ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
//   public void onRequestPermissionsResult(int requestCode, String[] permissions,
//                                          int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.removeUpdates(locationListener);
}
}
LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle
extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(Location location) {
// 更新当前设备的位置信息
showLocation(location);
}
};
private void showLocation(Location location) {
String currentPosition = "latitude is " + location.getLatitude() + "\n"
+ "longitude is " + location.getLongitude();
Log.e("location",currentPosition);
}
在2014demo中:
private void myLocation(MapboxMap mapboxMap) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mapboxMap.setMyLocationEnabled(true);
//        mapboxMap.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW);//持续跟踪
mapboxMap.getMyLocation();
}



在地图中显示方向-绘制路线
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(MapboxMap mapboxMap) {
map = mapboxMap;
// Add origin and destination to the map
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(origin.getLatitude(), origin.getLongitude()))
.title("Origin")
.snippet("Alhambra"));
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(destination.getLatitude(), destination.getLongitude()))
.title("Destination")
.snippet("Plaza del Triunfo"));
// Get route from API
try {
getRoute(origin, destination);
} catch (ServicesException e) {
e.printStackTrace();
}
}
});


private void  getRoute(Position origin, Position destination) throws ServicesException {
MapboxDirections client = new MapboxDirections.Builder()
.setOrigin(origin)
.setDestination(destination)
.setProfile(DirectionsCriteria.PROFILE_CYCLING)
.setAccessToken("<your access token here>")
.build();
client.enqueueCall(new Callback<DirectionsResponse>() {
@Override
public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
// You can get the generic HTTP info about the response
Log.d(TAG, "Response code: " + response.code());
if (response.body() == null) {
Log.e(TAG, "No routes found, make sure you set the right user and access token.");
return;
}
// Print some info about the route
currentRoute = response.body().getRoutes().get(0);
Log.d(TAG, "Distance: " + currentRoute.getDistance());
Toast.makeText(MainActivity.this, "Route is " +  currentRoute.getDistance() + " meters long.", Toast.LENGTH_SHORT).show();
// Draw the route on the map
drawRoute(currentRoute);
}
@Override
public void onFailure(Call<DirectionsResponse> call, Throwable t) {
Log.e(TAG, "Error: " + t.getMessage());
Toast.makeText(MainActivity.this, "Error: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void  drawRoute(DirectionsRoute route) {
// Convert LineString coordinates into LatLng[]
LineString lineString = LineString.fromPolyline(route.getGeometry(), Constants.OSRM_PRECISION_V5);
List<Position> coordinates = lineString.getCoordinates();
LatLng[] points = new LatLng[coordinates.size()];
for (int i = 0; i < coordinates.size(); i++) {
points[i] = new LatLng(
coordinates.get(i).getLatitude(),
coordinates.get(i).getLongitude());
}
// Draw Points on MapView
map.addPolyline(new PolylineOptions()
.add(points)
.color(Color.parseColor("#009688"))
.width(5));
}




长按绘制路线
private void longclick(final MapboxMap mapboxMap) {
mapboxMap.setOnMapLongClickListener(new MapboxMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng point) {
//删除所有之前的标记
mapboxMap.removeAnnotations();
// Set the origin waypoint to the devices location设置初始位置
Waypoint origin = new Waypoint(mapboxMap.getMyLocation().getLongitude(), mapboxMap.getMyLocation().getLatitude());
// 设置目的地路径--点击的位置点
Waypoint destination = new Waypoint(point.getLongitude(), point.getLatitude());
// Add marker to the destination waypoint
mapboxMap.addMarker(new MarkerOptions()
.position(new LatLng(point))
.title("目的地")
.snippet("My destination"));
// Get route from API
getRoute(origin, destination);
}
});
}



private void getRoute(Waypoint origin, Waypoint destination) {
MapboxDirections directions = new MapboxDirections.Builder()
.setAccessToken(MAPBOX_ACCESS_TOKEN)
.setOrigin(origin)
.setDestination(destination)
.setProfile(DirectionsCriteria.PROFILE_WALKING)
.build();
directions.enqueue(new Callback<DirectionsResponse>() {
@Override
public void onResponse(Response<DirectionsResponse> response, Retrofit retrofit) {
// Print some info about the route
currentRoute = response.body().getRoutes().get(0);
showToastMessage(String.format("You are %d meters \nfrom your destination", currentRoute.getDistance()));
// Draw the route on the map
drawRoute(currentRoute);
}
@Override
public void onFailure(Throwable t) {
showToastMessage("Error: " + t.getMessage());
}
});
}
private void showToastMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
private void drawRoute(DirectionsRoute route) {
// Convert List<Waypoint> into LatLng[]
List<Waypoint> waypoints = route.getGeometry().getWaypoints();
LatLng[] point = new LatLng[waypoints.size()];
for (int i = 0; i < waypoints.size(); i++) {
point[i] = new LatLng(
waypoints.get(i).getLatitude(),
waypoints.get(i).getLongitude());
}
// Draw Points on MapView
mapboxMap.addPolyline(new PolylineOptions()
.add(point)
.color(Color.parseColor("#38afea"))
.width(5));
}



地理位置搜索功能
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mas_geocoding);
// Set up the MapView
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(MapboxMap mapboxMap) {
map = mapboxMap;
}
});
// Set up autocomplete widget
GeocoderAutoCompleteView autocomplete = (GeocoderAutoCompleteView) findViewById(R.id.query);
autocomplete. setAccessToken( MapboxAccountManager.getInstance().getAccessToken());
autocomplete. setType(GeocodingCriteria.TYPE_POI);
autocomplete. setOnFeatureListener(new GeocoderAutoCompleteView.OnFeatureListener() {
@Override
public void  OnFeatureClick(GeocodingFeature feature) {
Position position = feature.asPosition();
updateMap(position.getLatitude(), position.getLongitude());
}
});
}
private void  updateMap(double latitude, double longitude) {
// Build marker
map.addMarker(new MarkerOptions()
.position(new LatLng(latitude, longitude))
.title("Geocoder result"));
//跳转目的地界面
// Animate camera to geocoder result location
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(latitude, longitude))
.zoom(15)
.build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 5000, null);
}


下载静态地图
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mas_static_image);
ImageView imageView = (ImageView) findViewById(R.id.mapImage);
MapboxStaticImage staticImage;
try {
staticImage = new MapboxStaticImage.Builder()
.setAccessToken(MapboxAccountManager.getInstance().getAccessToken())
.setUsername(Constants.MAPBOX_USER)
.setStyleId(Constants.MAPBOX_STYLE_SATELLITE)
.setLon(12.3378) // Image center longitude
.setLat(45.4338) // Image center Latitude
.setZoom(13)
.setWidth(640) // Image width
.setHeight(360) // Image height
.setRetina(true) // Retina 2x image will be returned
.build();
new DownloadImageTask(imageView).execute(staticImage.getUrl().toString());
} catch (ServicesException e) {
Log.e(TAG, "MapboxStaticImage error: " + e.getMessage());
e.printStackTrace();
}
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView imageView;
public DownloadImageTask(ImageView imageView) {
this.imageView = imageView;
}
protected Bitmap doInBackground(String... urls) {
// Create OkHttp object
final OkHttpClient client = new OkHttpClient();
// Build request
Request request = new Request.Builder()
.url(urls[0])
.build();
Response response = null;
Bitmap bitmap = null;
try {
// Make request
response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
// If the response is successful,
// create the static map image
if (response.isSuccessful()) {
try {
bitmap = BitmapFactory.decodeStream(response.body().byteStream());
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
}
return bitmap;
}
protected void onPostExecute(Bitmap result) {
// Add static map image to imageView
imageView.setImageBitmap(result);
}
}

 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_offline_simple);
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
// Set up the OfflineManager
offlineManager = OfflineManager.getInstance(this);
offlineManager.setAccessToken(MapboxAccountManager.getInstance().getAccessToken());
// Create a bounding box for the offline region
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(new LatLng(37.7897, -119.5073)) // Northeast
.include(new LatLng(37.6744, -119.6815)) // Southwest
.build();
// Define the offline region
OfflineTilePyramidRegionDefinition definition = new OfflineTilePyramidRegionDefinition(
mapView.getStyleUrl(),
latLngBounds,
10,
20,
this.getResources().getDisplayMetrics().density);
// Set the metadata
byte[] metadata;
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put(JSON_FIELD_REGION_NAME, "Yosemite National Park");
String json = jsonObject.toString();
metadata = json.getBytes(JSON_CHARSET);
} catch (Exception e) {
Log.e(TAG, "Failed to encode metadata: " + e.getMessage());
metadata = null;
}
// Create the region asynchronously
offlineManager.createOfflineRegion(definition, metadata, new OfflineManager.CreateOfflineRegionCallback() {
@Override
public void onCreate(OfflineRegion offlineRegion) {
offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE);
// Display the download progress bar
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
startProgress();
// Monitor the download progress using setObserver
offlineRegion.setObserver(new OfflineRegion.OfflineRegionObserver() {
@Override
public void onStatusChanged(OfflineRegionStatus status) {
// Calculate the download percentage and update the progress bar
double percentage = status.getRequiredResourceCount() >= 0 ?
(100.0 * status.getCompletedResourceCount() / status.getRequiredResourceCount()) :
0.0;
if (status.isComplete()) {
// Download complete
endProgress("Region downloaded successfully.");
} else if (status.isRequiredResourceCountPrecise()) {
// Switch to determinate state
setPercentage((int) Math.round(percentage));
}
}
@Override
public void onError(OfflineRegionError error) {
// If an error occurs, print to logcat
Log.e(TAG, "onError reason: " + error.getReason());
Log.e(TAG, "onError message: " + error.getMessage());
}
@Override
public void mapboxTileCountLimitExceeded(long limit) {
// Notify if offline region exceeds maximum tile count
Log.e(TAG, "Mapbox tile count limit exceeded: " + limit);
}
});
}
@Override
public void onError(String error) {
Log.e(TAG, "Error: " + error);
}
});
}
@Override
public void onResume() {
super.onResume();
mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
offlineManager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() {
@Override
public void onList(OfflineRegion[] offlineRegions) {
// delete the last item in the offlineRegions list which will be yosemite offline map
offlineRegions[(offlineRegions.length - 1)].delete(new OfflineRegion.OfflineRegionDeleteCallback() {
@Override
public void onDelete() {
Toast.makeText(SimpleOfflineMapActivity.this, "Yosemite offline map deleted", Toast.LENGTH_LONG).show();
}
@Override
public void onError(String error) {
Log.e(TAG, "On Delete error: " + error);
}
});
}
@Override
public void onError(String error) {
Log.e(TAG, "onListError: " + error);
}
});
}




// Progress bar methods
private void startProgress() {
// Start and show the progress bar
isEndNotified = false;
progressBar.setIndeterminate(true);
progressBar.setVisibility(View.VISIBLE);
}
private void setPercentage(final int percentage) {
progressBar.setIndeterminate(false);
progressBar.setProgress(percentage);
}
private void endProgress(final String message) {
// Don't notify more than once
if (isEndNotified) return;
// Stop and hide the progress bar
isEndNotified = true;
progressBar.setIndeterminate(false);
progressBar.setVisibility(View.GONE);
// Show a toast
Toast.makeText(SimpleOfflineMapActivity.this, message, Toast.LENGTH_LONG).show();
}

这篇关于Android地图应用新视界--mapbox的应用开发之简单功能提取篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020447

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof