- Xây dựng được chương trình lấy dữ liệu GPS chạy trên hệ điều hành android.
- Xây dựng được các modul chương trình tạo ra bản đồ hoàn chỉnh có độ chính xác cao:
+ Modul xử lý dữ liệu GPS thu thập được, bằng phương pháp xấp xỉ đoạn thẳng.
+ Modul tổng hợp dữ liệu tạo ra một bản đồ hoàn chỉnh từ dữ liệu GPS đã được xử lý.
+ Modul phát hiện các nút giao nhau giữa các con đường trên bản đồ.
- Cài đặt thuật toán tìm đường đi ngắn nhấn trên bản đồ.
3.4. Các điểm chƣa đạt đƣợc, hƣớng phát chiển
- Chương trình xây dựng chủ yếu để chứng minh cho những đề xuất về thuật toán trong luận văn, chưa tính đến nhiều yếu tố khác như hướng của đường đi, đường một chiều…
- Chương trình sử dụng dữ liệu GPS có tọa độ (Kinh độ; vĩ độ) để tìm đường đi ngắn nhất chưa ánh xạ tìm kiếm bằng tên đường và đây cũng là hướng phát triển của luận văn trong thời gian tới.
36
CHƢƠNG 4. KẾT LUẬN
Qua bài luận văn, chúng tôi đã trình bày về cách xây dựng một bản đồ giao thông, sử dụng dữ liệu GPS thu thập được bằng thiết bị di động. Mục đính chính của luận văn là đưa ra một quy trình xây dựng bản đồ giao thông có độ chính xác cao, thông qua các thuật toán xấp xỉ dữ liệu GPS. Đồng thời cũng trình bày cách cài đặt thuật toán tìm đường đi ngắn nhất, để so sánh đánh giá kết quả với bản đồ google map. - Quy trình xây dựng bản đồ giao thông :
+ Xây dựng chương trình thu thập dữ liệu GPS trên điện thoại chạy hệ điều hành android.
+ Đề xuất thuật toán xấp xỉ đoạn thằng và xây dựng modul chương trình xử lý dữ liệu GPS bằng thuật toán xấp xỉ.
+ Tổng hợp dữ liệu GPS của các con đường đã được xử lý bằng thuật toán.
+ Tạo ra bản đồ giao thông hoàn chỉnh bằng modul chương trình. - Mô tả thuật toán xấp xỉ chuỗi dữ liệu GPS :
Đầu vào là một chuỗi các điểm : A1, A2, A3……. An
Bước 1 : Tìm khoảng cách lớn nhất từ các điểm A2,A3…An-1 đến đoạn A1An. Giả sử Ai (2≤i< n) là điểm có khoảng cách lớn nhất tới A1An Bước 2 : Nếu khoảng cách lớn nhất tìm được lớn hơn ngưỡng esp đặt ra thì dữ lại Ai (nếu khoảng cách lớn nhất đó < esp thì loại bỏ các điểm A2,A3..An-1 lúc này đường thẳng đó là A1An), tiếp tục tìm điểm có khoảng cách lớn nhất từ các điểm A2,A3…Ai-1 tới đường thẳng A1Ai và khoảng cách lớn nhất từ các điểm Ai+1, Ai+2…An-1 tới đường thẳng nối AiAn. Những điểm có khoảng cách nhỏ hơn esp đặt ra được loại bỏ và dữ lại những điểm có khoảng cách lớn hơn esp. Thuật toán được lặp lại cho đến khi xét hết các điểm.
37
Đầu ra thu được chuỗi các điềm đặc trưng và có số điểm ít hơn số điểm đầu vào . Nối các điểm này tạo thành các đoạn thẳng được xấp xỉ trên đoạn đường đó.
- Thu thập và xây dựng được 1 phần bản đồ giao thông của trung tâm Hà Nội
- Hướng phát triển tiếp theo sẽ tiến tới xây dựng và bổ xung:
+ Mô tả cụ thể các điểm trên bản đồ số như ngôi nhà, trường học, bệnh viện.. + Xây dựng các vùng trên bản đồ như sông, hồ, đường biên giữa các tỉnh thành
phố.
+ Bổ xung thêm chức năng định vị trên bản đồ. + Ánh xạ tìm đường theo tên trên bản đồ.
38
DANH MỤC TÀI LIỆU THAM KHẢO
[1]. Cao, Lili, and John Krumm. "From GPS traces to a routable road map."Proceedings of the 17th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems. ACM, 2009.
[2]. Liu, Xuemei, et al. "Mining large-scale, sparse GPS traces for map inference: comparison of approaches." Proceedings of the 18th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2012.
[3]. Chen, Daniel, et al. "Road network reconstruction for organizing paths."Proceedings of the twenty-first annual ACM-SIAM symposium on Discrete Algorithms. Society for Industrial and Applied Mathematics, 2010.
[4]. Fathi, Alireza, and John Krumm. "Detecting road intersections from gps traces."Geographic Information Science. Springer Berlin Heidelberg, 2010. 56-69.
39
PHỤ LỤC
Phụ lục 1: Cài đặt thuật toán xấp xỉ chuỗi các điểm GPS để rút gọn kích thƣớc dữ liệu.
Sau khi thu thập được dữ liệu GPS của các tuyến đường giao thông, chúng ta sử dụng thuật toán xấp xỉ dữ liệu GPS. Thuật toán này sẽ sử dụng công thức haversin để tính khoảng cách giữa hai có tọa độ (lat,long)
Công thức haversin tính khoảng cách giữa hai điểm: a = sin²(Δφ/2) + cos(φ1).cos(φ2).sin²(Δλ/2)
c = 2.atan2(√a, √(1−a)) d = R.c
Trong đó φ là kinh độ (lat), λ là vĩ độ (long), d là khoảng cách giữa hai điểm và R= 6,371km là bán kính trái đất.
Chúng ta đi xét ba điểm có tọa độ lần lượt là (lat1,long1), (lat2,long2), (lat3,long3). Sử dụng công thức herong để tìm diện tích và chu vi của tam giác được tạo bởi 3 điểm có tọa độ ở trên. Từ đó tìm khoảng cách từ các điểm tới các cạnh đối diện với đỉnh đó (đường cao trong tam giác).
Công thức herong: S là diện tính tam giác a,b,c là các cạnh tam giác.
( )( )( )
S p pa p b p c
với p là nửa chu vi của tam giác:
2
a b c
p
h là đường cao trong tam giác.
( )( )( ) 2 a p p a p b p c h a
40 Approximate(Array P)
Đầu vào: 1 chuỗi các điểm P trên một tuyến đường, mỗi điểm P[i] tương ứng với 1 tọa độ (latitude, longitude)
Đầu ra: một chuỗi rút gọn các điểm đại diện cho tuyến đường đó
Begin
Tính khoảng cách giữa hai điểm gần nhất có tọa độ (lat1,long1) và (lat2,long2) sử dụng công thức haversin.
double aHarv = Math.pow(Math.sin(dlat / 2), 2.0) + Math.cos(dlat1) * Math.cos(dlat2) * Math.pow(Math.sin(dlong / 2), 2.0); // tính a=Harv
double cHarv = 2 * Math.atan2(Math.sqrt(aHarv), Math.sqrt(1.0 - aHarv)); // tính c = cHarv
double R = 6378.137;
return R * cHarv; // in km trả về kết quả khoảng cách hai điểm là d=R*Harv /* Tính khoảng cách h từ các đỉnh của tam giác tới các cạnh đối diện
double d1 = computeDistanceHav(long1, lat1, long2, lat2); //tính khoảng cách d1=a
double d2 = computeDistanceHav(long1, lat1, long3, lat3); //tính khoảng cách d2=b
double d12 = computeDistanceHav(long2, lat2, long3, lat3); //tính khoảng cách d12=c
double p = (d1 + d2 + d12) / 2; // tính chu vi tam giác
double S = Math.sqrt(p * (p - d1) * (p - d2) * (p - d12)); // tính diện tích của tam giác
double h = 2 * S / d12; // tính chiều cao của tam giác
41
/* loại bỏ những điểm có tọa độ không thỏa mãn điều kiện
maxDis = -10000; //điều kiện đặt ra
ind = -1;
String strList = "Data0="; // khởi tạo danh sách điểm ban đầu /* dùng vòng lặp for để xét lần lượt các điểm
for (int i = s + 1; i < e; i++) { Point v = P.get(i);
double d = computeDistancePoint2Edge(Double.parseDouble(v.getdLong() + ""), Double.parseDouble(v.getdLat() + ""), s_lng, s_lat, e_lng, e_lat);
if (d > maxDis) // nếu d> ngưỡng maxDis
{
maxDis = d; // gán maxdis=d
ind = i; // gán ind=i
strList += "(" + v.getdLat() + "," + v.getdLong() + "),"; }
}
listBestP.add(strList); // thêm các điểm thỏa mãn điều kiện vào danh sách
if(maxDis < eps) ind = -1; // nếu maxDis< ngưỡng eps thì trả ind=-1
return ind; // trả kết quả về ind và kết thúc vòng lặp
42
Phụ lục 2: Cài đặt Tool GPSMapEdit
Công cụ GPSMapEdit là một phần mềm không thể thiếu trong quá trình xây dựng bản đồ giao thông. Phần mềm này sẽ giúp chúng ta xem và hiển thị dữ liệu GPS thu thập được dưới dạng đường. Ngoài ra chúng còn giúp chỉnh sửa đặt tên các con đường sao cho đúng với bản đồ thật tạo độ chính xác cao cho bản đồ. Sau đây là đường link tải về và cách cài đặt GPSMapEdit:
Tải GPSMapEdit tại http://www.geopainting.com
Sau khi cài đặt xong GPSMapEdit ta có giao diện chương trình như hình dưới đây.
43
Phụ lục 3: Cài đặt phần mềm thu thập dữ liệu GPS .
Copy toàn bộ thư mục chứa chương trình cài đặt vào trong thẻ nhớ của điện thoại smart phone chạy hệ điều hành android. Sau đó tìm đến thư mục “ bin” trong thẻ nhớ điện thoại và chạy file “ MyGPSBuilder.apk “ làm theo hướng dẫn trên màn hình cho tới khi hoàn thành quá trình cài đặt. Để sử dụng chương trình này bạn phải bật chế độ GPS trên máy điện thoại, chương trình sẽ tự động dò tìm tọa độ tại vị trí đang đứng.
Chúng ta muốn lấy dữ liệu GPS từ vị trí nào thì nhấn nút start ở vị trí đó và di chuyển theo con đường cần lấy dữ liệu, cho tới khi kết thúc con đường nhấn nút Store để lưu lại con đường đó dưới dạng file *.mp .
44
Phụ lục 4 : Định dạng file *.mp
Một file *.mp để hiển thị được trên giao diện của GPSMapEdit phải có những phần như sau:
Phần 1: gồm id tiêu đề do GPSMapEdit quy chuẩn để đọc và hiển thị các file *.mp. trong mỗi file *.mp phần đầu bao giờ cũng có phần này chúng đều giống nhau.
Generated by GPSMapEdit 1.1.73.2 [IMG ID] CodePage=1252 LblCoding=9 ID=55120001 Name=OpenStreetMap Preprocess=F TreSize=11543 TreMargin=0.00000 RgnLimit=127 POIIndex=Y POIZipFirst=N MG=Y Numbering=Y Routing=Y
Copyright=PROGRAM LICENCED UNDER GPL V2|OPENSTREETMAP.ORG
CONTRIBUTORS. SEE:
HTTP://WIKI.OPENSTREETMAP.ORG/INDEX.PHP/ATTRIBUTION. MAP BUILT BY CARLOS DAVILA. HTTP
45
Phần 2: thể hiện các mức phóng to hoặc thu nhỏ lại các con đường hoặc bản đồ có định dạng file *.mp, chúng có dạng như sau.
Levels=8 Level0=24 Level1=22 Level2=20 Level3=18 Level4=16 Level5=14 Level6=12 Level7=11 Zoom0=0 Zoom1=1 Zoom2=2 Zoom3=3 Zoom4=4 Zoom5=5 Zoom6=6 Zoom7=7
Phần 3: thể hiện một chuỗi các điểm dưới dạng tọa độ (lat,long) khi hiển thị trên GPSMapEdit chúng được nối với nhau tạo thành đường trong bản đồ.
[POLYLINE] Type=0x5
Data0=(21.01864445,105.85663784),(21.01462518,105.85840694) [END]
46 Type=0x5 Data1=(21.01864445,105.85663784),(21.01462518,105.85840694) [END] [POLYLINE] Type=0x5 Data2=(21.01864445,105.85663784),(21.01462518,105.85840694) [END] [POLYLINE] Type=0x5 Data3=(21.01864445,105.85663784),(21.01462518,105.85840694) [END] [POLYLINE] Type=0x5 Data4=(21.01864445,105.85663784),(21.01462518,105.85840694) [END] [POLYLINE] Type=0x5 Data5=(21.01864445,105.85663784),(21.01462518,105.85840694) [END] Phụ lục 5: Định dạng OpenStreetMap
OpenStreetMap là một định dạng XML có đuôi mở rộng là *.OSM. Trong file XML sử dụng các thẻ node, way, relation, tag. Các thẻ này mô tả các đặc điểm trên bản đồ như sau:
Thẻ Node: Một node đại diện cho một điểm cụ thể trên bề mặt trái đất được xác định bởi tọa độ (kinh độ, vĩ độ). Mỗi node có ít nhất một id và một cặp tọa độ. Node có thể được sử dụng để xác định một điểm nổi bật như nó có thể đại diện cho một ghế đá
47
trong công viên hoặc một giếng nước nào đó trên bản đồ. Ngoài ra node còn sử dụng để xác định hình dạng của một con đường.
Thẻ way: Một way là một tập danh sách các node khoảng từ 2 đến 2000 node dùng để xác định một polyline. Thẻ way được sử dụng để thể hiện các đặc điểm tuyến tính như đặc điểm của đường bộ hoặc các con sông…
Thẻ way cũng có thể đại diện cho ranh giới của khu vực như danh giới các tòa nhà hoặc danh giới của khu rừng.
Thẻ relation: Một relation là một cấu trúc dữ liệu mô tả mối quan hệ giữa các node, way hoặc các mối quan hệ khác. Ví dụ như mối quan hệ giữa các tuyến đường, trong đó liệt kê số đường cao tốc, một con đường vòng, hoặc một tuyến đường xe buýt. Thẻ tag: Trong tất cả các node, way, relation có thể có thẻ tag. Thẻ này mô tả ý nghĩa của các yếu tố cụ thể mà chúng được đính kèm. Một thẻ tag bao gồm hai lĩnh vực định dạng văn bản bao gồm một „key‟ và một „value‟. Mỗi một „key‟ và một „value‟ này có chuỗi Unicode lên đến 255 ký tự.
Dưới đây là một tập tin OSM XML rút gọn hoàn chỉnh: <?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="CGImap 0.0.2">
<bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>
<node id="298884269" lat="54.0901746" lon="12.2482632" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09- 21T21:37:45Z"/>
<node id="261728686" lat="54.0906309" lon="12.2441924" user="PikoWinter" uid="36744" visible="true" version="1" changeset="323878" timestamp="2008-05- 03T13:39:23Z"/>
48
<node id="1831881213" version="1" changeset="12370172" lat="54.0900666" lon="12.2539381" user="lafkor" uid="75625" visible="true" timestamp="2012-07- 20T09:43:19Z">
<tag k="name" v="Neu Broderstorf"/> <tag k="traffic_sign" v="city_limit"/> </node>
...
<node id="298884272" lat="54.0901447" lon="12.2516513" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09- 21T21:37:45Z"/>
<way id="26659127" user="Masch" uid="55988" visible="true" version="5" changeset="4142606" timestamp="2010-03-16T11:47:08Z">
<nd ref="292403538"/> <nd ref="298884289"/> ...
<nd ref="261728686"/>
<tag k="highway" v="unclassified"/> <tag k="name" v="Pastower Straße"/> </way>
<relation id="56688" user="kmvar" uid="56190" visible="true" version="28" changeset="6947637" timestamp="2011-01-12T14:23:49Z">
<member type="node" ref="294942404" role=""/> ...
<member type="node" ref="364933006" role=""/> <member type="way" ref="4579143" role=""/> ...
49 <tag k="name" v="Küstenbus Linie 123"/> <tag k="network" v="VVW"/>
<tag k="operator" v="Regionalverkehr Küste"/> <tag k="ref" v="123"/>
<tag k="route" v="bus"/> <tag k="type" v="route"/> </relation>
... </osm>