Android 在两个覆盖层之间绘制路线
在我的应用程序中,我在地图上显示了2个位置,并用记号笔标记了它们。现在,我想在他们之间画一条路线,我不知道该怎么做。我的函数绘图应该是什么样子 这是我的代码:Android 在两个覆盖层之间绘制路线,android,routes,mapactivity,Android,Routes,Mapactivity,在我的应用程序中,我在地图上显示了2个位置,并用记号笔标记了它们。现在,我想在他们之间画一条路线,我不知道该怎么做。我的函数绘图应该是什么样子 这是我的代码: package com.ShoppingList.Maps; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.Canvas; import android.graphics.Color;
package com.ShoppingList.Maps;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.widget.TextView;
import android.widget.Toast;
import com.ShoppingList.R;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;
import java.util.ArrayList;
import java.util.List;
public class OnMap extends MapActivity {
private MapView map = null;
private MyLocationOverlay me = null;
//private myOverlay m = null;
double latitudine;
double longitudine;
double latshop;
double longshop;
String nameshop;
Canvas canvas = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shopsonmap);
map = (MapView) findViewById(R.id.shopsonmap);
latitudine = getIntent().getDoubleExtra("latcurent", 0);
longitudine = getIntent().getDoubleExtra("longcurent", 0);
latshop = getIntent().getDoubleExtra("latshop", 0);
longshop = getIntent().getDoubleExtra("longshop", 0);
nameshop = getIntent().getStringExtra("nameshop");
GeoPoint p1 = new GeoPoint((int) latitudine, (int) longitudine);
GeoPoint p2 = new GeoPoint((int) latshop, (int) longshop);
map.getController().setCenter(getPoint(latitudine, longitudine));
map.getController().setZoom(15);
map.setBuiltInZoomControls(true);
map.setSatellite(false);
map.setStreetView(true);
map.invalidate();
Drawable marker = getResources().getDrawable(R.drawable.marker);
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker
.getIntrinsicHeight());
map.getOverlays().add(new SitesOverlay(marker));
me = new MyLocationOverlay(this, map);
map.getOverlays().add(me);
}
/*class myOverlay extends Overlay {
GeoPoint gp1;
GeoPoint gp2;
public myOverlay(GeoPoint gp1, GeoPoint gp2) {
this.gp1 = gp1;
this.gp2 = gp2;
}
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
Paint mPaint = new Paint();
Point from = new Point();
projection.toPixels(gp1, from);
mPaint.setColor(Color.BLUE);
Point to = new Point();
projection.toPixels(gp2, to);
mPaint.setStrokeWidth(9);
mPaint.setAlpha(120);
canvas.drawLine(from.x, from.y, to.x, to.y, mPaint);
super.draw(canvas, mapView, shadow);
}
}*/
@Override
public void onResume() {
super.onResume();
me.enableCompass();
}
@Override
public void onPause() {
super.onPause();
me.disableCompass();
}
@Override
protected boolean isRouteDisplayed() {
return (false);
}
private GeoPoint getPoint(double lat, double lon) {
return (new GeoPoint((int) (lat * 1000000.0), (int) (lon * 1000000.0)));
}
private class SitesOverlay extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> items = new ArrayList<OverlayItem>();
private Drawable marker = null;
public SitesOverlay(Drawable marker) {
super(marker);
this.marker = marker;
items.add(new OverlayItem(getPoint(latitudine, longitudine),
"Your location", "You are here!"));
items.add(new OverlayItem(getPoint(latshop, longshop), "The shop",
"The shop " + nameshop + " is here"));
populate();
}
@Override
protected OverlayItem createItem(int i) {
return (items.get(i));
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
boundCenterBottom(marker);
}
@Override
protected boolean onTap(int i) {
Toast.makeText(OnMap.this, items.get(i).getSnippet(),
Toast.LENGTH_SHORT).show();
return (true);
}
@Override
public int size() {
return (items.size());
}
}
}
package com.ShoppingList.Maps;
导入android.content.Context;
导入android.graphics.drawable.drawable;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Point;
导入android.location.location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.Bundle;
导入android.os.Handler;
导入android.view.KeyEvent;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.ShoppingList.R;
导入com.google.android.maps.GeoPoint;
导入com.google.android.maps.ItemizedOverlay;
导入com.google.android.maps.MapActivity;
导入com.google.android.maps.MapView;
导入com.google.android.maps.MyLocationOverlay;
导入com.google.android.maps.Overlay;
导入com.google.android.maps.OverlayItem;
导入com.google.android.maps.Projection;
导入java.util.ArrayList;
导入java.util.List;
OnMap的公共类扩展了MapActivity{
私有MapView map=null;
private MyLocationOverlay me=null;
//私有myOverlay m=null;
双纬度;
双纵联;
双层厕所;
双长廊;
字符串名称库;
Canvas=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.shopsonmap);
map=(MapView)findViewById(R.id.shopsonmap);
latitudine=getIntent().getDoubleExtra(“latcurent”,0);
longitudine=getIntent().getDoubleExtra(“longcurent”,0);
latshop=getIntent().getDoubleExtra(“latshop”,0);
longshop=getIntent().getDoubleExtra(“longshop”,0);
nameshop=getIntent().getStringExtra(“nameshop”);
地质点p1=新的地质点((int)纬向,(int)纵向);
地质点p2=新的地质点((int)latshop,(int)longshop);
map.getController().setCenter(getPoint(latitudine,longitudine));
map.getController().setZoom(15);
map.setBuiltInZoomControls(真);
地图.固定卫星(假);
map.setStreetView(真);
map.invalidate();
Drawable marker=getResources().getDrawable(R.Drawable.marker);
marker.setBounds(0,0,marker.getIntrinsicWidth(),marker
.getIntrinsicHeight());
map.getOverlays().add(新的SitesOverlay(标记));
me=新的MyLocationOverlay(此,地图);
map.getOverlays().add(me);
}
/*类myOverlay扩展覆盖{
地质点gp1;
地质点gp2;
公共myOverlay(地质点gp1、地质点gp2){
这是gp1=gp1;
这是gp2=gp2;
}
公共空白绘制(画布、地图视图、地图视图、布尔阴影){
Projection=mapView.getProjection();
Paint mPaint=新油漆();
点源=新点();
投影。toPixels(gp1,来自);
mPaint.setColor(Color.BLUE);
指向=新点();
投影。toPixels(gp2,to);
mPaint.设定行程宽度(9);
mPaint.setAlpha(120);
画布绘制线(from.x,from.y,to.x,to.y,mPaint);
super.draw(画布、地图视图、阴影);
}
}*/
@凌驾
恢复时公开作废(){
super.onResume();
me.enableCompus();
}
@凌驾
公共无效暂停(){
super.onPause();
我。禁用指南针();
}
@凌驾
受保护的布尔值isRouteDisplayed(){
返回(假);
}
专用地质点获取点(双纬度、双经度){
返回(新地质点((内部)(纬度*1000000.0),(内部)(纬度*1000000.0));
}
私有类SitesOverlay扩展ItemizeOverlay{
私有列表项=新的ArrayList();
私有可绘制标记=null;
公共场地航道(可牵引标记){
超级(标记);
this.marker=标记;
添加(新的覆盖项(获取点(纬度、经度),
“你的位置”,“你在这里!”);
添加(新的覆盖项(getPoint(latshop,longshop),“The shop”,
“商店”+名称商店+“在这里”);
填充();
}
@凌驾
受保护的OverlayItem createItem(int i){
返回(items.get(i));
}
@凌驾
公共空白绘制(画布、地图视图、地图视图、布尔阴影){
super.draw(画布、地图视图、阴影);
边界中心底部(标记);
}
@凌驾
受保护的布尔onTap(int i){
Toast.makeText(OnMap.this,items.get(i).getSnippet(),
吐司。长度(短)。show();
返回(真);
}
@凌驾
公共整数大小(){
返回(items.size());
}
}
}
谢谢。我已经给出了这个问题的答案,请阅读下面的链接
我希望这会有所帮助。因此,假设您正在从REST web服务获取位置(JSON格式)。为此,我使用Volley库连接并从服务器获取响应 JSONArray响应的示例: [{…,“地点”:“44.924654,8.586219”,…}, {…,“地点”:“44.906177,8.157752”,…}, {…,“位置”:“44.906177,8.157752”,{…,“位置”: “44.956733,7.876227”,…},{…,“地点”:“45.034424,7.671607”, …}] 步骤是将第一个和最后一个位置设置为标记,中间位置将在它们之间画一条线 因为位置是以字符串的形式获得的,所以我们必须首先拆分字符串,并将“,”之前的部分指定为纬度,其余部分指定为经度
public void onResponse(JSONArray response) {
if (response.length() > 0) {
try {
//creating the markers: for this I need the first and the last location
JSONObject firstLocationJson = response.getJSONObject(0);
JSONObject lastLocationJson = response.getJSONObject(response.length() - 1);
String[] firstLocationLatLng = firstLocationJson.getString("location").split(",");
Location firstLocation = new Location(LocationManager.GPS_PROVIDER);
firstLocation.setLatitude(Double.parseDouble(firstLocationLatLng[0]));
firstLocation.setLongitude(Double.parseDouble(firstLocationLatLng[1]));
String[] lastLocationLatLng = lastLocationJson.getString("location").split(",");
Location lastLocation = new Location(LocationManager.GPS_PROVIDER);
lastLocation.setLatitude(Double.parseDouble(lastLocationLatLng[0]));
lastLocation.setLongitude(Double.parseDouble(lastLocationLatLng[1]));
final float distance = firstLocation.distanceTo(lastLocation); //distance in meters
if (distance > 50000 && distance < 200000) { //distance bigger than 50 km
showMapView(response, firstLocation, lastLocation, 7);
} else if (distance > 300000) {
showMapView(response, firstLocation, lastLocation, 5);
}
} catch (JSONException e) {
// TODO
}
}
// TODO -
}
private void showMapView(JSONArray response, Location firstLoc, Location lastLoc, final int zoom) {
final LatLng latLng1 = new LatLng(firstLoc.getLatitude(), firstLoc.getLongitude());
final LatLng latLng2 = new LatLng(lastLoc.getLatitude(), lastLoc.getLongitude());
final MarkerOptions marker1 = new MarkerOptions().position(latLng1);
final MarkerOptions marker2 = new MarkerOptions().position(latLng2);
final PolylineOptions polylineOptions = new PolylineOptions();
final ArrayList<LatLng> points = new ArrayList<LatLng>();
//saving all the locations in an ArrayList
if (response.length() > 0) {
for (int i = 0; i < response.length(); i++) {
JSONObject locationsJson = null;
try {
locationsJson = response.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
String locationString = null;
try {
locationString = locationsJson.getString("location");
} catch (JSONException e) {
e.printStackTrace();
}
//here I am splitting the location string in a String array.
String[] locationLatLng = locationString.split(",");
Location loc = new Location(LocationManager.GPS_PROVIDER);
loc.setLatitude(Double.parseDouble(locationLatLng[0]));
loc.setLongitude(Double.parseDouble(locationLatLng[1]));
LatLng latLng = new LatLng(loc.getLatitude(), loc.getLongitude());
points.add(latLng);
}
}
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.addMarker(marker1);
googleMap.addMarker(marker2);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, zoom));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng2, zoom));
polylineOptions.addAll(points);
polylineOptions.width(10);
polylineOptions.color(Color.BLUE);
googleMap.addPolyline(polylineOptions);
}
});
}
};
mainHandler.post(myRunnable);
}