지도에 경로를 띄우고 DDMS로 현재 위치를 보내거나 KML 파일을 실행시키면 경로가 지워지는데...ㅜㅜ
안지워지게 할수 있는 방법이 없나요???
---------------------------------------------------------------------------------------------
map.java
package net.hybus.TextViewApp;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import android.graphics.Color;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import java.io.*;
import java.util.*;
import android.app.*;
import android.os.Bundle;
import android.content.*;
import android.location.*;
import android.view.*;
import android.widget.*;
import android.graphics.*;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class map extends MapActivity implements LocationListener{
private MapView mapView;
public TextView textView;
int latitude=37500000;
int longitude=127500000;
MapView map_view;
MapController controller;
LocationManager manager;
Location curLocation;
String provider;
Geocoder coder;
String TAG="MapTestActivity";
final static int QuestionDialog = 1;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.map);
mapView = (MapView)findViewById(R.id.map_view);
controller = mapView.getController();
mapView.setBuiltInZoomControls(true);
checkProvider();
coder = new Geocoder(getApplicationContext(), Locale.KOREA);
Fun();
}
public void Fun()
{
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if(tm.getNetworkCountryIso() == "kr")
{
Toast.makeText(map.this, "korea.",Toast.LENGTH_SHORT).show();
}
else
{
double src_lat = 37.796979; // the testing source
double src_long = -122.393092;
double dest_lat = 38.09986; // the testing destination
double dest_long = -122.263053;
GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),
(int) (src_long * 1E6));
GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),
(int) (dest_long * 1E6));
DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);
mapView.getController().animateTo(srcGeoPoint);
mapView.getController().setZoom(15);
}
}
private void DrawPath(GeoPoint src,GeoPoint dest, int color, MapView mMapView01)
{
// connect to map web service
StringBuilder urlString = new StringBuilder();
urlString.append("http://maps.google.com/maps?f=d&hl=en");
urlString.append("&saddr=");//from
urlString.append( Double.toString((double)src.getLatitudeE6()/1.0E6 ));
urlString.append(",");
urlString.append( Double.toString((double)src.getLongitudeE6()/1.0E6 ));
urlString.append("&daddr=");//to
urlString.append( Double.toString((double)dest.getLatitudeE6()/1.0E6 ));
urlString.append(",");
urlString.append( Double.toString((double)dest.getLongitudeE6()/1.0E6 ));
urlString.append("&ie=UTF8&0&om=0&output=kml");
urlString.append("&dirflg=w"); // map mode change = driving, walking, etc
Log.d("xxx","URL="+urlString.toString());
// get the kml (XML) doc. And parse it to get the coordinates(direction route).
Document doc = null;
HttpURLConnection urlConnection= null;
URL url = null;
try
{
url = new URL("urlString.toString();
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(urlConnection.getInputStream());
if(doc.getElementsByTagName("GeometryCollection").getLength()>0)
{
//String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getNodeName();
String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue() ;
Log.d("xxx","path="+ path);
String[] pairs = path.split(" ");
String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height
// src
GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
mMapView01.getOverlays().add(new MyOverLay(startGP,startGP,1));
GeoPoint gp1;
GeoPoint gp2 = startGP;
for(int i=1;i<pairs.length;i++) // the last one would be crash
{
lngLat = pairs[i].split(",");
gp1 = gp2;
// watch out! For GeoPoint, first:latitude, second:longitude
gp2 = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
mMapView01.getOverlays().add(new MyOverLay(gp1,gp2,2,color));
Log.d("xxx","pair:" + pairs[i]);
}
mMapView01.getOverlays().add(new MyOverLay(dest,dest, 3)); // use the default color
}
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ParserConfigurationException e)
{
e.printStackTrace();
}
catch (SAXException e)
{
e.printStackTrace();
}
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
protected void onResume() {
super.onResume();
// 마지막으로 얻은 위치가 있으면 보기
Location loc = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (loc != null) {
onLocationChanged(loc);
}
// 현재 위치가 변화하는 경우 메서드가 호출되도록 등록, 1초마다 5km 이동시
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 5, this);
// 기지국으로 부터 위치정보를 업데이트 요청
//manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 5, this);
}
@Override
protected void onPause() {
super.onPause();
// 위치 정보 통지 등록 취소
manager.removeUpdates(this);
}
// 지도상에 화살표 이미지와 텍스트 문자열을 표시한다.
public void setOverlay(GeoPoint p, String addr) {
Bitmap icon = BitmapFactory.decodeResource(
getResources(),R.drawable.position);
IconOverlay overlay = new IconOverlay(icon, p, addr);
List<Overlay> overlays = mapView.getOverlays();
overlays.clear(); // 위치가 이동되면 기존 overlay 정보는 제거
overlays.add(overlay);
}
// GeoCoder 를 이용하여 수신된 위치정보에 대한 주소를 찾아서 문자열로 반환
private String showLocationName(Location loc) {
double latitude = loc.getLatitude();
double longitude = loc.getLongitude();
StringBuffer buff = new StringBuffer();
try {
List<Address> addrs = coder.getFromLocation(latitude, longitude, 1);
for (Address addr : addrs) {
int index = addr.getMaxAddressLineIndex();
for (int i = 0; i <= index; ++i) {
buff.append(addr.getAddressLine(i));
buff.append(" ");
}
//buff.append("\n");
}
} catch (IOException e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
return buff.toString();
}
// 가장 베스트하게 사용가능한 Provider 를 검색
public void checkProvider() {
manager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria cta=new Criteria();
cta.setAccuracy(Criteria.ACCURACY_FINE); // 정확도
cta.setPowerRequirement(Criteria.POWER_HIGH); // 전원 소비량
cta.setAltitudeRequired(false); // 고도, 높이 값을 얻어 올지를 결정
cta.setSpeedRequired(true); // 속도
cta.setCostAllowed(false); // 위치 정보를 얻어 오는데 들어가는 금전적 비용
provider=manager.getBestProvider(cta, true);
}
// 위치정보가 갱신되면 호출
public void onLocationChanged(Location location) {
GeoPoint gp = new GeoPoint((int)(location.getLatitude()*1E6),
(int)(location.getLongitude
()*1E6));
controller.animateTo(gp);
curLocation = location;
String strloc = String.format("위도:%f 경도:%f 속도:%f",
(float)location.getLatitude(), (float)location.getLongitude
(), (float)(location.getSpeed()*3.6));
setOverlay(gp, strloc);
}
// 위치정보를 제공하는 프로바이더가 disable 되었을때 호출
public void onProviderDisabled(String provider) {
}
// 위치정보를 제공하는 프로바이더가 enable 되었을때 호출
public void onProviderEnabled(String provider) {
}
// 위치정보를 제공하는 프로바이더가 enable 또는 disable 되었을때 호출
public void onStatusChanged(String provider, int status, Bundle extras) {
}
// 지도위에 이미지나 텍스트를 출력하기 위한 클래스
private class IconOverlay extends Overlay {
Bitmap mIcon;
GeoPoint mPoint;
String addr;
int mOffsetX;
int mOffsetY;
IconOverlay(Bitmap icon, GeoPoint initial, String addr) {
mIcon = icon;
mOffsetX = 0 - icon.getWidth() / 2 + 5;
mOffsetY = 0; //-icon.getHeight();
mPoint = initial;
this.addr=addr;
}
// 지도를 탭하면 호출
@Override
public boolean onTap(GeoPoint point, MapView mapView) {
mPoint = point;
return super.onTap(point, mapView);
}
// 지도를 그릴 때, shadow = true, shadow = false를 2 번 호출
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
if (!shadow) {
// 지도상의 위치와 그린의 Canvas의 좌표 변환
Projection projection = mapView.getProjection();
Point point = new Point();
Paint paint=new Paint();
paint.setAntiAlias(true);
paint.setShadowLayer(10, 0, 0, Color.GRAY);
paint.setTextSize(14);
paint.setColor(Color.RED);
projection.toPixels(mPoint, point);
canvas.drawText(addr, point.x-20, point.y+50, paint);
point.offset(mOffsetX, mOffsetY);
// 아이콘 그리기
canvas.drawBitmap(mIcon, point.x, point.y, null);
}
}
}
}//IconOverlay끝
/** Called when the activity is first created. */
---------------------------------------------------------------------------------------------------------------------------------
MyOverLay.java
package net.hybus.TextViewApp;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class MyOverLay extends Overlay
{
private GeoPoint gp1;
private GeoPoint gp2;
private int mRadius=6;
private int mode=0;
private int defaultColor;
private String text="";
private Bitmap img = null;
public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode) // GeoPoint is a int. (6E)
{
this.gp1 = gp1;
this.gp2 = gp2;
this.mode = mode;
defaultColor = 999; // no defaultColor
}
public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor)
{
this.gp1 = gp1;
this.gp2 = gp2;
this.mode = mode;
this.defaultColor = defaultColor;
}
public void setText(String t)
{
this.text = t;
}
public void setBitmap(Bitmap bitmap)
{
this.img = bitmap;
}
public int getMode()
{
return mode;
}
@Override
public boolean draw
(Canvas canvas, MapView mapView, boolean shadow, long when)
{
Projection projection = mapView.getProjection();
if (shadow == false)
{
Paint paint = new Paint();
paint.setAntiAlias(true);
Point point = new Point();
projection.toPixels(gp1, point);
// mode=1:start
if(mode==1)
{
if(defaultColor==999)
paint.setColor(Color.BLUE);
else
paint.setColor(defaultColor);
RectF oval=new RectF(point.x - mRadius, point.y - mRadius,
point.x + mRadius, point.y + mRadius);
// start point
canvas.drawOval(oval, paint);
}
// mode=2:path
else if(mode==2)
{
if(defaultColor==999)
paint.setColor(Color.RED);
else
paint.setColor(defaultColor);
Point point2 = new Point();
projection.toPixels(gp2, point2);
paint.setStrokeWidth(5);
paint.setAlpha(120);
canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
}
/* mode=3:end */
else if(mode==3)
{
/* the last path */
if(defaultColor==999)
paint.setColor(Color.GREEN);
else
paint.setColor(defaultColor);
Point point2 = new Point();
projection.toPixels(gp2, point2);
paint.setStrokeWidth(5);
paint.setAlpha(120);
canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
RectF oval=new RectF(point2.x - mRadius,point2.y - mRadius,
point2.x + mRadius,point2.y + mRadius);
/* end point */
paint.setAlpha(255);
canvas.drawOval(oval, paint);
}
}
return super.draw(canvas, mapView, shadow, when);
}
-----------------------------------------------------------------------------------------------------------------------------------------
}