Thuật toán bỏ điểm là phƣơng pháp làm đơn giản yếu tố dạng đƣờng dựa vào mật độ điểm có trên đƣờng. Thuật toán này thực chất là quá trình xử lý từng điểm nằm trên đƣờng. Có thể lƣợc bỏ bớt điểm của đƣờng theo một trong hai cách là lƣợc bỏ bớt điểm của đƣờng theo một chu kỳ nhất định hoặc là lựa chọn điểm ngẫu nhiên. Đƣợc triển khai theo các bƣớc sau:
1. Thực hiện nhóm các điểm liền kề nhau thành các nhóm.
2. Lƣợc bỏ bớt điểm theo một trong hai cách: Lựa chọn điểm ngẫu nhiên (Chọn ngẫu nhiên một số điểm giữ lại điểm đầu và điểm cuối của đƣờng line) hoặc Lựa chọn điểm theo chu kỳ (Đặt ra một chu kỳ lấy điểm, cứ bao nhiêu điểm trên đƣờng thẳng ta lấy một điểm các điểm còn lại ta lƣợc bỏ và giữ lại điểm đầu và điểm cuối của đƣờng line) Dung sai v15 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v1 v15 v2 v3 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 Đƣờng đơn giản Đƣờng vuông góc có chiều dài lớn nhất
tại điểm V10, lớn hơn dung sai
Tạo 2 đƣờng cơ sở mới tại điểm bẻ gãy V10
48
3.2.3. Thuật toán sử dụng khoảng cách giữa các điểm hoặc đường vuông góc
Các bƣớc thực hiện thuật toán đƣợc mô tả nhƣ sau: 1. Đƣa ra độ dài của đoạn dung sai.
2. Lƣợc bỏ điểm theo một trong hai cách
+ Dựa vào khoảng cách giữa các điểm: So sánh chiều dài hai điểm liên tiếp với dung sai đặt ra nếu cạnh nào nhỏ hơn dung sai thì lƣợc bỏ điểm cuối của đoạn đó. Cứ làm nhƣ vậy cho đến hết đƣờng. Giữ điểm đầu và điểm cuối của đƣờng.
+ Dựa vào đƣờng vuông góc: Lấy 2 cạnh liên tiếp thành một nhóm nối điểm đầu và điểm cuối trong nhóm thành một đƣờng thẳng sau đó từ điểm giữa còn lại của nhóm hạ đƣờng vuông góc xuống đƣờng thẳng vừa dựng. So sánh chiều dài đƣờng vuông góc đó với dung sai đặt ra ban đầu nếu đƣờng vuông góc tại điểm nào nhỏ hơn dung sai thì lƣợc bỏ điểm đó. Giữ điểm đầu và điểm cuối của đƣờng.
49
3.2.4. Thuật toán Reumann- Witkam
Là thuật toán dùng các đƣờng thẳng song song với các đoạn thẳng trên đƣờng để lựa lƣợc bỏ điểm. Các bƣớc thực hiện nhƣ sau:
1. Đƣa ra độ rộng của hai đƣờng thẳng song song
2. Lấy hai đƣờng thẳng song song với mỗi cạnh của đoạn thẳng về hai bên trái và phải sao cho đúng với độ rộng ban đầu đƣa ra.
3. Lƣợc bỏ bớt điểm nằm trong khoảng của hai đƣờng song song đó. Giữ điểm đầu và điểm cuối nằm trong đƣờng song song lƣợc bỏ điểm ở giữa.
50
3.2.5. Thuật toán Zhao - Saalfeld
Cũng giống nhƣ thuật toán của Reumann- Wikam là sử dụng các đƣờng thẳng song song nhƣng đƣợc đánh giá là đơn giản hơn. Điểm khác biệt là có thể lƣợc bỏ nhiều điểm cùng một lúc nên rút ngắn đƣợc thời gian xử lý. Thuật toán đƣợc triển khai theo các bƣớc nhƣ sau:
1. Nhóm các điểm liền kề nhau trên một đƣờng thành một nhóm. 2. Đƣa ra độ rộng của đƣờng thẳng song song.
3. Dựng hai đƣờng thẳng song song với đƣờng thẳng nối giữa điểm đầu và điểm cuối của nhóm về hai bên phải và trái, sao cho khoảng các giữa hai đƣờng đó đúng bằng độ rộng của đƣờng thẳng song song ban đầu đƣa ra.
4. Lƣợc bỏ tất cả những điểm nằm trong khoảng hai đƣờng song song đó đi qua. Giữ lại điểm đầu và điểm cuối nằm trong khoảng song song.
51
3.2.6. Thuật toán Opheim
Thuật toán của Opheim đƣợc xây dựng trên cơ sở đƣa ra một vùng bao để lƣợc bỏ điểm. Thuật toán triển khai theo các bƣớc sau:
1. Đƣa ra độ lớn của bán kính lớn nhất và bán kính nhỏ nhất để tạo vùng bao. Lấy mỗi điểm giữ lại làm tâm cho hai đƣờng tròn với hai bán kính trên. Thuật toán đƣợc bắt đầu từ điểm đầu tiên của đƣờng.
2. Lƣợc bỏ những điểm nằm trong vùng bao bởi hai đƣờng tròn trên
3. Giữ lại điểm có khoảng cách xa tâm nhất và lấy điểm đó làm tâm của vùng bao khác. Cứ làm nhƣ vậy cho đến điểm cuối của đƣờng.
52
3.2.7. Thuật toán Lang
Thuật toán dùng đƣờng vuông góc để lƣợc bỏ điểm, đƣợc thực hiện theo các bƣớc nhƣ sau:
1. Đƣa ra khoảng cách dung sai
2. Nhóm các điểm gần nhau thành các nhóm
3. Nối 2 điểm đầu và cuối trong nhóm thành một đƣờng thẳng sau đó từ các điểm còn lại trong nhóm hạ vuông góc xuống đƣờng vừa dựng.
4. So sánh các đƣờng vuông góc với dung sai đặt ra ban đầu, đƣờng vuông góc nào nhỏ hơn dung sai thì lƣợc bỏ điểm đó, đƣờng vuông góc nào lớn hơn thì ta phải nhóm nhóm đó theo cách: Ta bỏ bớt điểm cuối cùng của nhóm ra khỏi nhóm làm lại từ bƣớc 3. Các điểm đầu nhóm và cuối nhóm đều giữ lại.
53
3.2.8. Thuật toán Visvalingam – Whyatt
Thuật toán này đƣa ra những vùng hình tam giác đƣợc hình thành bởi 3 điểm liên tiếp trên đƣờng. Nếu điểm nào có khoảng cách gần tâm của tam giác đó là nhỏ nhất thì điểm đó bị lƣợc bỏ. thuật toán này sẽ đặt ra cố điểm đƣờng đơn giản cuối cùng. Khi đạt đƣợc số điểm đó thì thuật toán sẽ kết thúc.Ở những vùng cần xử lý khối lƣợng dữ liệu lớn thì thuật toán này xử lý tốt hơn thuật toán của Douglas – Peucker.
54
Các thuật toán trên đều là các thuật toán đơn giản, nhanh và chính xác, các điểm đƣợc giữ lại dễ dàng xác định và không có bất cứ một quan hệ nào với những điểm lân cận. Ƣu điểm thuật toán đơn giản, dễ hiểu và không làm xê dịch vị trí điểm ban đầu. Các thuật toán này đều phụ thuộc chủ yếu và mật độ điểm và sự phức tạp của đƣờng (độ uốn cong, gãy khúc).
55
Chương 4: XÂY DỰNG ỨNG DỤNG KHÁI QUÁT HÓA BẢN ĐỒ
Xây dựng phần mềm hỗ trợ khái quát hóa bản đồ tự động nhằm tới là giảm thiểu đƣợc các công đoạn thủ công khái quát hóa bản đồ trong qui trình thành lập bản đồ bằng công nghệ số, tiến tới đáp ứng các yêu cầu về chiết xuất các gói dữ liệu từ cơ sở dữ liệu địa hình quốc gia theo các yêu cầu và qui định do ngƣời dùng tự định nghĩa.
4.1. Phân tích và thiết kế hệ thống 4.1.1. Yêu cầu phần mềm 4.1.1. Yêu cầu phần mềm
Hiện nay các phần mềm thƣơng mại nhƣ: Arcgis desktop, MapInfo, Map Generalization,... cung cấp các công cụ để thực hiện các thao tác khái quát hóa bản đồ. Tại Việt Nam những nghiên cứu về khái quát hóa bản đồ tự động đƣợc đầu tƣ, quan tâm nhằm đáp ứng các yêu cầu bức thiết khi xây dựng cơ sở dữ liệu bản đồ. Bên cạnh các yêu cầu về độ tin cậy, tính chính xác, thời gian xử lý,... ngƣời thao tác cần phải đƣợc cung cấp các công cụ khái quát hoá có mức độ tự động cao, có thể đáp ứng nhanh chóng các yêu cầu đa dạng của ngƣời sử dụng về tỷ lệ, phạm vi, chuyên đề và mức độ chi tiết.
Việc đƣa vào sử dụng các công cụ khái quát hóa giúp giảm bớt chi phí và nâng cao chất lƣợng thành lập bản đồ số. Hiện tại các công cụ này tƣơng đối ít, chủ yếu dành cho khái quát hoá các đối tƣợng độc lập, đòi hỏi sự can thiệp của kỹ thuật viên ở nhiều công đoạn.
Các mục tiêu mà phần mềm hỗ trợ khái quát hóa tự động nhằm tới là giảm thiểu đƣợc các công đoạn thủ công khái quát hóa bản đồ trong qui trình thành lập bản đồ bằng công nghệ số, tiến tới đáp ứng các yêu cầu về chiết xuất các gói dữ liệu từ cơ sở dữ liệu địa hình quốc gia theo các yêu cầu và qui định do ngƣời dùng tự định nghĩa.
Những yêu cầu chung đối với phần mềm hỗ trợ khái quát hóa tự động bao gồm: - Cung cấp những chức năng cần thiết cho công tác khái quát hóa bản đồ trong qui trình thành lập bản đồ từ dữ liệu địa lý tỷ lệ lớn hơn.
- Đáp ứng các qui định, qui phạm, chuẩn hiện hành về dữ liệu địa lý.
- Có khả năng trao đổi dữ liệu với các phần mềm quản lý dữ liệu địa lý thông dụng.
- Tốc độ xử lý nhanh, ổn định.
- Sử dụng đơn giản, giao diện bằng tiếng Việt, các chức năng gần gũi với các cán bộ chuyên môn.
56
4.1.2. Các chức năng của phần mềm
Trong phạm vi nghiên cứu, tìm hiểu của luận văn, phần mềm đƣợc xây dựng với những tính năng cơ bản sau:
- Hỗ trợ hiển thị, thao các các định dạng dữ liệu cơ bản: ESRI Shapefile(Dữ liệu shapfile là cấu trúc dữ liệu GIS của công ty ESRI, Một shapefile đƣợc tổ chức thành các tập tin riêng rẽ tối thiểu cần có 3 tập tin với phần mở rộng là ".shp", ".shx" và ".dbf".), Raster(.bmp, .gif, .png,...),...
- Chức năng phân tích dữ liệu: cho phép thống kê số lƣợng đối tƣợng dạng vùng, dạng điểm, dạng đƣờng theo sơ đồ phân mảnh, theo địa phận, theo phạm vi bất kỳ.
- Các chức năng thao tác trên bản đồ: dịch chuyển bản đồ, phóng to, thu nhỏ, hiển thị vừa khung, đo đạc, xem thông tin đối tƣợng đƣợc chọn,...
- Chức năng tổng quát hóa các đối tƣợng dạng điểm nhƣ lọc bỏ dữ liệu theo thông tin thuộc tính, mức độ quan trọng.
- Chức năng tổng quát hóa các đối tƣợng dạng đƣờng bao gồm lọc bỏ dữ liệu theo thông tin thuộc tính, theo ngƣỡng chiều dài tối thiểu, đơn giản hóa dữ liệu không gian sử dụng các thuật toán đơn giản hóa đƣờng cong.
- Chức năng tổng quát hóa các đối tƣợng dạng vùng nhƣ lọc bỏ dữ liệu theo thuộc tính, theo diện tích tối thiểu.
4.2. Giải pháp triển khai 4.2.1. Công nghệ GIS 4.2.1. Công nghệ GIS
Hiện nay có rất nhiều công nghệ lõi GIS phục vụ phát triển, xây dựng các ứng dụng GIS. Có thể chia ra làm hai mảng thƣơng mại: ArcGIS Engine, MapX, MapSuite,... và mã nguồn mở: MapWindows, SharpMap, DotSpatial,...
Phần mềm đƣợc xây dựng sử dụng bộ thƣ viện mã nguồn mở DotSpatial. Đây là bộ thƣ viện hỗ trợ khá nhiều tính năng đồ họa, cho phép thể hiện tốt các đối tƣợng không gian, lực nét, nhãn và ký hiệu bản đồ.
DotSpatial cung cấp môi trƣờng lập trình thuận tiện cho các nhà phát triển ứng dụng có thể xây dựng và mở rộng các ứng dụng GIS.
DotSpatial cung cấp các thành phần cơ bản: - Cung cấp các dịch vụ truy xuất dữ liệu.
- Cung cấp các chức năng biên tập, trình bày bản đồ. - Cung cấp các control cơ bản: MapControl, Legend,... - Cung cấp các API cho việc mở rộng, xây dựng ứng dụng.
57
4.2.2. Ngôn ngữ lập trình
Sử dụng ngôn ngữ lập trình C# .NET. Đây là một ngôn ngữ rất đơn giản, với khoảng 80 từ khoá và hơn mƣời kiểu dữ liệu dựng sẵn, nhƣng C# có tính diễn đạt cao. C# hỗ trợ lập trình có cấu trúc, hƣớng đối tƣợng, hƣớng thành phần (component oriented).
Trọng tâm của ngôn ngữ hƣớng đối tƣợng là lớp. Lớp định nghĩa kiểu dữ liệu mới, cho phép mở rộng ngôn ngữ theo hƣớng cần giải quyết. C# có những từ khoá dành cho việc khai báo lớp, phƣơng thức, thuộc tính (property) mới. C# hỗ trợ đầy đủ khái niệm trụ cột trong lập trình hƣớng đối tƣợng: đóng gói, thừa kế, đa hình.
Định nghĩa lớp trong C# không đòi hỏi tách rời tập tin tiêu đề với tập tin cài đặt nhƣ C++. Hơn thế, C# hỗ trợ kiểu sƣu liệu mới, cho phép sƣu liệu trực tiếp trong tập tin mã nguồn. Đến khi biên dịch sẽ tạo tập tin sƣu liệu theo định dạng XML.
C# hỗ trợ khái niệm giao diện, interfaces (tƣơng tự Java). Một lớp chỉ có thể kế thừa duy nhất một lớp cha nhƣng có thế cài đặt nhiều giao diện.
C# có kiểu cấu trúc, struct (không giống C++). Cấu trúc là kiểu hạng nhẹ và bị giới hạn.Cấu trúc không thể thừa kế lớp hay đƣợc kế thừa nhƣng có thể cài đặt giao diện.
C# cung cấp những đặc trƣng lập trình hƣớng thành phần nhƣ property, sự kiện và dẫn hƣớng khai báo (đƣợc gọi là attribute). Lập trình hƣớng component đƣợc hỗ trợ bởi CLR thông qua siêu dữ liệu (metadata). Siêu dữ liệu mô tả các lớp bao gồm các phƣơng thức và thuộc tính, các thông tin bảo mật ….
Assembly là một tập hợp các tập tin mà theo cách nhìn của lập trình viên là các thƣ viện liên kết động (DLL) hay tập tin thực thi (EXE). Trong .NET một assembly là một đơn vị của việc tái sử dụng, xác định phiên bản, bảo mật, và phân phối. CLR cung cấp một số các lớp để thao tác với assembly.
C# cũng cho truy cập trực tiếp bộ nhớ dùng con trỏ kiểu C++, nhƣng vùng mã đó đƣợc xem nhƣ không an toàn. CLR sẽ không thực thi việc thu dọn rác tự động các đối tƣợng đƣợc tham chiếu bởi con trỏ cho đến khi lập trình viên tự giải phóng.
58
4.2.3. Tổ chức triển khai
Phần mềm đƣợc xây dựng phát triển trên môi trƣờng Microsoft Visual Studio 2010.
- Thƣ mục Core lƣu trữ các project lõi của DotSpatial, cung cấp các chức năng, API phục vụ xây dựng chƣơng trình khái quá hóa.
- Thƣ mục MapGeneralization chứa project chính của chƣơng trình khái quá hóa. - Thƣ mục Plugins chứa các project đƣợc xây dựng cung cấp, mở rộng các chức năng cho chƣơng trình chính.
Project MapGeneralizationPlugin
Cài đặt triển khai các chức năng khái quát hóa. Sử dụng các thuật toán đơn giản hóa đƣờng cong.
59
Cài đặt thuật toán Douglas- Peucker
+ Thuật toán đƣợc cài đặt trong file clsDouglasPeucker.cs
/// <summary>
/// Khái quát hóa đối tượng dạng đường
/// Sử dụng thuật toán Douglas-Peucker
/// </summary>
public class DouglasPeuckerSimplifyLine
{
//Khai báo các biến toàn cục
private readonly IList<Point> _pts; private bool[] _usePoint;
private double _tolerance;
private readonly LineSegment _seg = new LineSegment(); /// <summary>
/// Đơn giải hóa đường
/// </summary>
/// <param name="pts">Danh sách các điểm</param>
/// <param name="distanceTolerance">Dung sai</param>
/// <returns>Trả lại kết quả là tập điểm được giữ lại</returns>
public static IList<Point> Simplify(IList<Point> pts, double distanceTolerance)
{
DouglasPeuckerSimplifyLine simplify = new
DouglasPeuckerSimplifyLine(pts); simplify._tolerance = distanceTolerance; return simplify.Simplify(); } /// <summary> /// Hàm khởi tạo /// </summary>
/// <param name="pts">Danh sách điểm</param>
private DouglasPeuckerSimplifyLine(IList<Point> pts) {
_pts = pts; }
/// <summary>
/// Đơn giản hóa tập điểm _pts
/// </summary>
/// <returns></returns>
private Point[] Simplify() {
//Khởi tạo mảng bool với số phần tử bằng số lượng điểm của //đường cần giản lược
_usePoint = new bool[_pts.Count];
//Gán giá trị true cho mảng bool _usePoint
for (int i = 0; i < _pts.Count; i++) _usePoint[i] = true;
60
//Gọi hàm đơn giản hóa với đường ban đầu - vị trí điểm đầu, //điểu cuối
SimplifyLine(0, _pts.Count - 1);
//Khai báo list chứa các điểm giữ lại của đường
PointList pointList = new PointList(); //Duyệt qua danh sách điểm ban đầu
for (int i = 0; i < _pts.Count; i++)
//Nếu điểm thứ i được giữ lại (_usePoint[i] = true), thì đưa //điểm đó vào danh sách kết quả
if (_usePoint[i])
pointList.Add(new Point(_pts[i])); //Trả lại kết quả là tập điểm được giữ lại
return pointList.ToPointArray(); }
/// <summary>
/// Đơn giản hóa một đoạn trên đường gốc
/// </summary>
/// <param name="i">điểm đầu đoạn</param>
/// <param name="j">điểm cuối đoạn</param>
private void SimplifyLine(int i, int j) {
//Nếu từ i đến j là một đoạn thẳng
if ((i + 1) == j) return;
//Khởi tạo một đường thẳng
_seg.P0 = _pts[i];