Tải bản đầy đủ (.pdf) (21 trang)

Báo cáo lập trình android chỉ dẫn người dùng theo vị trí

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.24 MB, 21 trang )

TRƯNG ĐI HC BCH KHOA H NI
VIỆN CÔNG NGHỆ THÔNG TIN V TRUYỀN THÔNG

BO CO BI TẬP LỚN
LẬP TRÌNH ANDROID
ĐỀ TÀI 1:
Chỉ dẫn người dùng theo vị trí



Giáo viên hướng dẫn: Nguyễn Hồng Quang
Sinh viên thực hiện:
Nguyễn Khánh Hưng 20081279 TTM-K53
Bùi Văn Hải 20080842 HTĐ1-K53
Trần Văn Toàn 20082715 TTM-K53
Đỗ Ngọc Tân 20082312 TTM-K53


H Ni 11/2012
2

MỤC LỤC
I. Cơ sở lý thuyết 3
1. Giới thiệu chung 3
2. Các tham số truy cập Google Maps 3
II. Mô tả các chức năng chính của chương trình 4
1. Nội dung công việc 4
2. Các chức năng 5
3. Cấu trúc chương trình 6
III. Cài đặt chương trình 6
1. Hiển thị MapView 6


2. Hiển thị người dùng trên bản đồ số 7
3. Cảnh bảo người dùng trước một địa điểm xác định 7
4. Dẫn đường người dùng 8
5. Hiển thị thông tin thời tiết 13
IV. Minh họa kết quả 17
V. KẾT LUẬN 20
TÀI LIỆU THAM KHẢO 21


3

I. Cơ sở lý thuyết
1. Giới thiệu chung
Trong thế giới web ngày nay, các giải pháp bản đồ là một thành phần không
thể thiếu. Chúng ta sử dụng chúng để thấy vị trí của mọi vật, để tìm vị trí của một
địa chỉ, để lấy về thông tin dẫn đường, và làm nhiều thứ khác. Hầu hết thông tin có
một vị trí, và nếu vật nào đó có một vị trí thì nó có thể hiển thị trên một bản đồ.
Có một số công ty cung cấp các giải pháp về bản đồ như Yahoo! Maps và
Bing Maps, nhưng phổ biến nhất vẫn là Google maps. Thực tế theo trang
programmableweb.com, google maps là API phổ biến nhất trên internet. Theo thống
kê của trang này tháng 5/2010, 43% là sử dụng Google Maps API.

Để sử dụng được các dịch vụ và API của google maps bạn cần phải đăng ký với
dịch vụ Google Maps và đồng ý với các điều khoản dịch vụ áp dụng trước khi bạn
lấy dữ liệu từ Google Maps.
2. Các tham số truy cập Google Maps
2.1. Geocoding
Geocoding là quá trình chuyển đổi địa chỉ giống như “Bach Khoa Ha Noi” )
thành tọa độ địa lý (như latitude "21.004409", longitude "105.845896"), mà chúng
ta có thể sử dụng để dánh dấu hay định vị


4

 Geocoding Request

Trong đó output có thể là các giá trị sau:
 json file chỉ dẫn output trong JavaScript Object Notation (JSON)
 xml: file xml
 Các thông số yêu cầu
o address: địa chỉ muốn thành geocode
hoặc latlng: giá trị latitude/longitude
hoặc components: thành phần lọc mà chúng ta muốn có
geocode
o sensor: có hoặc không yêu cầu mã hóa vị trí địa lý từ một thiết
bị với cảm biến vị trí. Giá trị true hoặc false
o
 Geocode responses
Xml trả về thông tin địa chỉ đã nhập
/>&sensor=false
Trong đó: address = địa điểm cần biết thông tin
II. Mô tả các chức năng chính của chương trình
1. Nội dung công việc
Chỉ dẫn người dùng theo vị trí
Phát triển một ứng dụng chạy trên thiết bị đầu cuối di động thực hiện các
chức năng sau:
o Hiển thị vị trí người dùng trên bản đồ số (chẳng hạn Google Map)
được mở ra trên màn hình thiết bị di động
o Cảnh báo người dùng khi họ đứng gần (phạm vi bán kính 200m) một
địa điểm xác định trước;
o Dẫn đường người dùng với các bản tin chỉ dẫn bằng văn bản;

5

o Dẫn đường người dùng bằng các lời nhắc âm thanh;
o Hiển thị thông tin thời tiết tại địa điểm muốn đến
2. Các chức năng
 Hiển thị Google Maps
 Hiển thị vị trí người dùng trên Google Maps
 Mô tả: Khi thiết bị nhận được tín hiệu GPS, chương trình sẽ tự
động hiển thị vị trí của thiết bị trên bản đồ.
 Cảnh báo người dùng khi họ đứng gần (phạm vi bán kính 200m) một địa
điểm xác định
 Mô tả: Ban đầu người dùng click vào một vị trí bất kỳ trên bản đồ
(vị trí đích cần đến). Sau đó nhấn vào menu “Địa điểm” để lưu lại
vị trí đích. Khi thiết bị nằm trong bán kính vị trí đích 200m,
chương trình sẽ hiển thị thông tin nhắc nhở người dùng.
 Dẫn đường người dùng với các bản tin chỉ dẫn bằng văn bản
 Mô tả: Người dùng click vào menu “Tìm đường”, nhập địa chỉ
nguồn và địa chỉ đích. Sau đó click button “OK”, chương trình sẽ
hiển thị đường đi giữa 2 vị trí và văn bản chỉ dẫn người dùng.
 Dẫn đường người dùng bằng các lời nhắc âm thanh.
 Mô tả: Ban đầu người dùng click vào một vị trí bất kỳ trên bản đồ
(vị trí đích cần đến). Sau đó nhấn vào menu “Địa điểm” để lưu lại
vị trí đích. Sau đó khi click vào menu “Voice Routing” thiết bị sẽ
hiển thị lời nhắc bằng văn bản và bằng âm thanh cho người dùng.
 Hiển thị thông tin thời tiết tại địa điểm muốn đến
 Mô tả: Khi người dùng click vào một vị trí bất kỳ trên bản đồ, sau
đó nhấn menu “Thời tiết” chương trình sẽ hiển thị thông tin thời
tiết tại nơi muốn đến. Thông tin gồm hình ảnh, địa điểm, thời gian
hiện tại, nhiệt độ và thời tiết cụ thể. Ngoài ra còn có thêm chức
năng xem thông tin thời tiết cụ thể khi người dùng truy cập vào

địa chỉ cung cấp thông qua button “More”.

6

3. Cấu trúc chương trình
Chương trình chạy trên hệ điều hành Android phiên bản Android Google
API 4.1.2
 Class MapsActivity: Class chính với các chức năng thực hiện các nhiệm
vụ: tạo các chức năng cho chương trình, cập nhật vị trí, tạo cơ sở dữ liệu
nếu chưa tồn tại,
 Class InfoRouting: lấy thông tin định tuyến từ file xml: danh danh vị trí,
và chỉ dẫn
 Class WeatherForecast: lấy thông tin thời tiết từ file xml
 Class WeatherHelper: tạo, truy vấn cơ sở dữ liệu về thời tiết.

III. Cài đặt chương trình
1. Hiển thị MapView
Để hiển thị được Google Maps trong ứng dụng trước hết cần phải đăng kí 1
key miễn phí từ Google Maps API , rồi sử dụng mapview để hiển thị .
 Tạo file xml có chứa MapView


<com.google.android.maps.MapView

android:id="@+id/mvMain"

android:layout_width="fill_parent"

android:layout_height="fill_parent"


android:apiKey="02qRkLmrjmMkRpapZNpr0E_FzOesmyBtaBhdu8A"

android:enabled="true"

android:clickable="true"

/>

 Tạo Activity
Activity muốn hiển thị được Google Maps cần phải extends MapActivity và
override phương thức isRouteDisplayed().

7

2. Hiển thị người dùng trên bản đồ số
Để hiển thị vị trí người sử dụng trên bản đồ , class Activity chính phải
implements interface LocationListener và cài đặt một số phương thức khác :
 onLocationChanged(Location l) : Phương thức này được gọi mỗi khi vị
trí của người sử dụng thay đổi (tọa độ mà GPS nhận được thay đổi). Ở
phương thức này sẽ xác định kinh độ , vĩ độ của vị trí hiện tại và vẽ lại
hình ảnh (OverlayItem)
 onProviderDisabled(String provider)
 onProviderEnabled(String provider)
 onStatusChanged(String provider, int status, Bundle extras)
Để xác định kinh độ , vĩ độ hiện tại sử dụng :
public void onLocationChanged(Location location)
{
pointGPS = new GeoPoint((int)(location.getLatitude() *
1E6), (int)(location.getLongitude() * 1E6));
}



Để hiển thị vị trí ta thêm hình ảnh vị trí trên Google Maps chúng ta sẽ thêm
item vào overlay của Maps. Trước tạo một lớp mới MyOverlay kế thừa Overlay
Trong phương thức draw ta thêm dòng lệnh sau:
Point screenPts = new Point();
mapView.getProjection().toPixels(pointGPS, screenPts);

// add the marker
Bitmap bmpOri = BitmapFactory.decodeResource(
getResources(), R.drawable.notify_icon);
canvas.drawBitmap(bmpOri, screenPts.x-16, screenPts.y-32,
null);

3. Cảnh bảo người dùng trước một địa điểm xác định
Để cảnh báo cho người dùng thì trước tiên phải cập nhật vị trí người dùng

public void onLocationChanged(Location location) {
int lat = (int) (location.getLatitude() * 1E6);
int lng = (int) (location.getLongitude() * 1E6);
GeoPoint point = new GeoPoint(lat, lng);
createMarker();
mapController.animateTo(point);
mapController.setCenter(point);
8


}
Lấy địa chỉ điểm cần đến và tính khoảng cách với vị trí hiện tại và tính. Khoảng
cách 2 điểm cho tới khi cách vị trí cần tới 200m thì đưa ra thông báo


if(pointGoal != null)
{
float[] distance = new float[2];
double startLat = pointGPS.getLatitudeE6() / 1.0E6;
double startLon = pointGPS.getLongitudeE6()/ 1.0E6;
double endLat = pointGoal.getLatitudeE6() / 1.0E6;
double endLon = pointGoal.getLongitudeE6() / 1.0E6;
Location.distanceBetween(startLat, startLon, endLat,
endLon, distance);

if(distance[0] <= 200.0)
{
Toast.makeText(MapsActivity.this, "Bạn cách đích " +
(int)distance[0] + " mét.", Toast.LENGTH_LONG).show();
}
}

Để thực hiện việc cảnh báo người dùng, trước tên cần lựa chọn 1 vị trí sẽ đến, vị trí
đó được lưu vào biến pointGoal

4. Dẫn đường người dùng
Từ vị trí của điểm nguồn có kinh độ , vĩ độ là x1,y1 , cần xác định chỉ dẫn tới
điểm đích có kinh độ , vĩ độ là x2, y2 .
Để xác định ta phân tích file xml tải về từ url :
/>stination=x2,y2&sensor=false&units=metric"

Trong đó:
 origin = địa chỉ nguồn. . Sử dụng tham số này khi yêu cầu dẫn đường lái
xe. Khi phát triển trên nền tảng di động, để sử dụng MyLocatiion (tọa độ

GPS) ta thiết lập saddr trống “” đối với Android, đối với iPhone, thiết lập
saddr là “Current%20Location”.
 destination = địa chỉ đích. Sử dụng khi yêu cầu thông tin dẫn đường.
 language = ngôn ngữ hiển thị trong file xml
9

Cấu trúc của file như sau :
<DirectionsResponse>
<status></status>
<route>
<summary></summary>
<leg>
<step>
<travel_mode></travel_mode>
<start_location></start_location>
<end_location></end_location>
<polyline><points></points></polyline>
<duration><value></value><text></text></duration>
<html_instructions></html_instructions>
<distance><value></value><text></text></distance>
</step>
<step></step>

<duration></duration>
<distance></distance>
<start_location></start_location>
<end_location></endlocation>
<start_address></start_address>
<end_address></endress>


</route>
</DirectionsResponse>
File xml trên chứa các thông tin dẫn đường từ 2 điểm cho trước .
Trong các node <step> chứa các chỉ dẫn cụ thể về địa điểm tiếp theo cần tới.
Node <duration> chứa thời gian cần đi , tính theo vận tốc trung bình của các
phương tiện.
Node <distance> chứa khoảng cách tình theo đường bộ cần phải di chuyển
Node <start_location> và <end_location> chứa kinh độ , vĩ độ của địa điểm
bắt đầu và địa điểm kết thúc .
Node <start_address> và <end_address> là địa chỉ của 2 địa điểm .
Trong chương trình có 2 loại chỉ dẫn cho người dùng :
a. Chỉ đường bằng các chỉ dẫn văn bản :
 Mục tiêu
Lấy tọa độ điềm bắt đầu và đích đến của người dùng. Sau đó vẽ một
LinePath giữa 2 điểm.Hướng dẫn chi tiết cách đi bằng văn bản cho người
dùng.
10











 Vẽ đường
Xây dựng lớp InfoRouting đọc file xml để lấy được các thông tin về các

Node của lộ trình.
class InfoRouting{
//chứa các node của lộ trình
private ArrayList<String> listInstructions = new ArrayList<String>();
private void getDirections(){
nl3 = doc.getElementsByTagName("html_instructions");
for (int i = 0; i < nl3.getLength(); i++)
{
Node node3 = nl3.item(i);
String strInstru = Html.fromHtml(node3.getTextContent()).toString();
listInstructions.add(strInstru);
}
}
}
Sau khi có các Node lộ trình gọi lớp MyOverlays để vẽ.
public class MyOverlay extends Overlay {
@Override
public boolean draw(Canvas canvas, MapView mv, boolean shadow, long
when) {
super.draw(canvas, mv, shadow);
. . . . . . . . . . .
. . . . . . . . . . .

}
11

public void drawPath(MapView mv, Canvas canvas) {
. . . . . . . . . . . . . }
}
Để hiển thị chỉ dẫn lộ trình cho người dùng

Xây dụng lớp showInstructionsDialog():lớp này đọc các thông tin tại các
Node trong lớp Inforouting để hiện thị lên màn hình.
public void showInstructionsDialog()
{
final View view = getLayoutInflater().inflate(R.layout.instructions,
null);
TextView textView = (TextView)view.findViewById(R.id.viewInstru);



}
b. Chỉ đường bằng lời nhắc âm thanh
Giá trị cần lấy nằm trong node <html_instructions>. Giá trị này có định dạng
html chỉ rõ hướng đi tới địa điểm kế tiếp . Ví dụ :
Đi về hướng <b>Tây</b> lên <b>Tạ Quang Bửu</b> về phía <b>Ni b Bách Khoa</b>
Để lấy được dữ liệu này trước hết khởi tạo kết nối Http đến url phía trên và
lấy dữ liệu về InputStream :
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost httpPost = new HttpPost(url);
response = httpClient.execute(httpPost, localContext);
InputStream in = response.getEntity().getContent();
Sau đó dùng DocumentBuilder để phân tích :
DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(in);
Lấy về nội dung node <html_instructions> đầu tiên .
NodeList nl;
nl = doc.getElementsByTagName("html_instructions");
Node node = nl.item(0);

nextDirection = node.getTextContent();

×