Một cách tiếp cận xây dựng hệ thống thông tin địa lý trên mạng diện rộng trên cơ sở công nghệ nền của ESRI


Tóm tắt: Hạn chế lớn nhất của các hệ thống GIS đã được xây dựng và đưa vào ứng dụng ở nước ta là hầu hết đều vận hành trên máy đơn, mức độ chia sẻ thông tin rất thấp, giá trị sử dụng bị giảm dần theo thời gian. Chỉ có những hệ thống được vận hành trên mạng diện rộng mới tạo điều kiện cho đông đảo người dùng tham gia vận hành, duy trì, cập nhật dữ liệu, ngày càng nâng cao giá trị khai thác của hệ thống. Tác giả viết bài báo này nhằm mục đích chia sẻ với bạn đọc những nét cơ bản về một cách tiếp cận xây dựng hệ thống GIS trên mạng diện rộng: lựa chọn công nghệ nền, xây dựng phần mềm khách truy vấn, cập nhật dữ liệu thuộc tính và dữ liệu không gian từ xa, tối ưu hoá quá trình truyền tải dữ liệu không gian trên mạng. Đây là những kinh nghiệm tác giả đã tích luỹ được khi nghiên cứu, xây dựng hệ thống GIS trên mạng WAN quản lý công trình thuỷ lợi trong lưu vực sông Hồng.
1. Đặt vấn đề          
  Công nghệ hệ thống thông tin địa lý GIS ngày càng được ứng dụng rộng rãi trên thế giới trong nhiều lĩnh vực khác nhau, nhất là trong những lĩnh vực mà đối với các đối tượng, các hiện tượng được quan sát, được nghiên cứu và quản lý vị trí địa lý của chúng có ý nghĩa quan trọng. ở nước ta, những năm cuối của thế kỷ trước, người ta nói nhiều về công nghệ GIS, nhưng thực sự áp dụng GIS vào thực tiễn hãy còn chưa được nhiều. Những năm gần đây, nhờ sự nỗ lực của các cơ quan chuyên môn, của các đơn vị công nghệ thông tin, công nghệ GIS đang dần len chân vào cuộc sống một cách thầm lặng và đạt được những kết quả đáng khích lệ. Tuy nhiên, những kết quả đó vẫn còn có rất nhiều hạn chế so với yêu cầu của thực tiễn. Rà soát lại những gì đã đạt được trong việc xây dựng và ứng dụng các hệ GIS ở nước ta, theo chúng tôi, trong những hạn chế đang tồn tại thì cái hạn chế lớn nhất là vấn đề tổ chức chia sẻ và cập nhật thông tin.
            Chúng ta biết rằng, để xây dựng một hệ thống thông tin đã khó, nhưng duy trì sự tồn tại của nó, nâng cao tính hữu ích cùng với thời gian lại càng khó hơn. Hiện nay, phần lớn các hệ GIS đã được ứng dụng trong nước đều là những hệ vận hành trên máy đơn hoặc trong mạng nội bộ, số người tham gia khai thác, vận hành và duy trì chúng rất ít. Nhiều hệ GIS sau khi kết thúc dự án, đề tài hầu như không bao giờ được cập nhật dữ liệu. Vì vậy, sau một thời gian chúng chỉ còn giá trị quảng cáo, trình diễn. Thông thường trong một hệ thống GIS các đối tượng được quản lý có vị trí địa lý phân bố rải rác cách xa nhau. Những người hoặc cơ quan trực tiếp quản lý, khai thác và nắm thông tin về các đối tượng này vì thế cũng ở cách xa nhau. Đối với hệ thống GIS, chính họ và chỉ họ mới là những người có thể duy trì và nâng cao tính hữu ích của hệ thống theo với thời gian. Không có điều kiện để cho những người này trở thành tác nhân tích cực của hệ thống, hệ thống sẽ mất dần giá trị của nó. Rõ ràng là các hệ GIS vận hành trên máy đơn hoặc mạng LAN sẽ không đáp ứng được yêu cầu đó. Chỉ có các hệ vận hành trên mạng WAN thông qua Internet hoặc tổ chức kết nối trực tiếp theo số điện thoại (dial-up) mới có thể tạo được điều kiện cho những tác nhân cần thiết tham gia vận hành hệ thống.
            Cho đến nay, so với các môn khoa học công nghệ khác trong ngành công nghệ thông tin, các tài liệu viết về công nghệ GIS không có nhiều. Phần lớn các tài liệu này hoặc chỉ đề cập đến những khái niệm cơ bản của công nghệ GIS, hoặc là những tài liệu hướng dẫn sử dụng các công cụ phục vụ các hệ thống GIS của các công ty thương mại như MapInfo, ArcView, Geomedia... Hầu như chưa có một tài liệu nào trình bày một cách cụ thể quy trình xây dựng một hệ thống GIS bằng tiếng Việt, đặc biệt đối với hệ thống trên mạng WAN. Trong khuôn khổ bài báo này, chúng tôi muốn chia sẻ với bạn đọc kinh nghiệm của mình về những vấn đề rất cơ bản xây dựng một hệ thống GIS trên mạng WAN mà chúng tôi tích luỹ được trong quá trình xây dựng hệ thống GIS quản lý các công trình thuỷ lợi ở lưu vực sông Hồng. Hy vọng rằng, sau này sẽ có điều kiện để chúng tôi có thể trình bày đầy đủ, chi tiết hơn những công việc mà chúng tôi đã thực hiện để xây dựng hệ thống GIS nói trên. 
2. Lựa chọn công nghệ nền            Như mọi ngành khoa học công nghệ khác, ngày nay, thực hiện mọi việc từ con số không để xây dựng hệ thống GIS là một điều bất hợp lý. Sử dụng các công nghệ có sẵn để làm nền tảng cho sự phát triển tiếp theo là điều hiển nhiên. Như vậy, lựa chọn công nghệ nền nào cho phù hợp? Để có thể trả lời câu hỏi đó, trước hết ta phải xem xét các yêu cầu cơ bản mà một hệ thống GIS trên mạng WAN cần phải đáp ứng. Đó là:
            - Cho phép truy vấn dữ liệu từ xa
            - Cho phép cập nhật dữ liệu thuộc tính từ xa
            - Cho phép cập nhật dữ liệu không gian từ xa.
            Tất nhiên, ở đây ta cũng không thể bỏ qua các yêu cầu quan trọng khác đối với hệ thống, như thân thiện với người dùng, quản lý được khối lượng thông tin lớn, thực hiện giao dịch trên mạng nhanh... Nhưng xét theo những kết quả đã đạt được trong việc ứng dụng công nghệ GIS ở nước ta trong những năm gần đây, các yêu cầu được liệt kê trên vẫn phải là những yêu cầu cần được xem xét đầu tiên. Xuất phát từ các yêu cầu này, ta có thể đưa ra những tiêu chí để lựa chọn công nghệ nền, sắp xếp chúng theo thứ tự ưu tiên như sau:
            - Hỗ trợ quản trị CSDL không gian đa người dùng
            - Hỗ trợ giao dịch, truyền tải dữ liệu không gian trên mạng cho phần mềm khách (client)
            - Hỗ trợ lập trình giao diện GIS cho phần mềm khách (hiển thị bản đồ, tìm kiếm đối tượng, thao tác với bản đồ bằng các thiết bị đầu cuối...)
            - Giá chuyển giao thấp
            - Xây dựng hệ thống nhanh
            - Có thể kết hợp với các công nghệ nền khác, với các hợp phần do người lập trình tự phát triển.
            Nói chung, khó có thể chọn được một công nghệ nền đáp ứng đồng thời tất cả các yêu cầu trên, đặc biệt là yêu cầu về giá chuyển giao và yêu cầu đối với các khả năng kỹ thuật công nghệ của sản phẩm. Vì vậy, việc lựa chọn phải dựa trên thứ tự ưu tiên của các tiêu chí đã nêu.
            Trong các công nghệ nền GIS thương mại hiện nay, đáng chú ý nhất là công nghệ của viện nghiên cứu môi trường ESRI của Mỹ và công nghệ của hãng MapInfo là những công nghệ cung cấp các giải pháp tương đối đồng bộ cho việc xây dựng một hệ thống GIS. Bên cạnh hai công nghệ trên là công nghệ mã nguồn mở OpenGIS. Về góc độ giải pháp kỹ thuật công nghệ, công nghệ nền của ESRI đáp ứng khá đầy đủ các tiêu chí chúng ta đặt ra. Điểm mạnh nhất của công nghệ GIS của ESRI là quản trị CSDL không gian đa người dùng trên mạng WAN, hỗ trợ giao dịch, truyền tải dữ liệu không gian trên mạng cho phần mềm khách. Công nghệ GIS của ESRI ban đầu được phát triển cho môi trường UNIX, sau đó mới chuyển sang môi trường Windows trên các máy PC. Do vậy, các giải pháp quản trị CSDL không gian đa người dùng, giải pháp mạng của ESRI được phát triển hoàn chỉnh và đồng bộ. Nhược điểm của loại công nghệ này là giá chuyển giao khá cao so với điều kiện hiện nay ở nước ta.
            Công nghệ mã nguồn mở OpenGIS rất hấp dẫn đối với các nhà phát triển. ứng dụng mã nguồn mở sẽ là điều kiện thuận lợi cho sự sáng tạo của các nhà phát triển phần mềm, không mất phí chuyển giao, tuy nhiên, nó đòi hỏi nhiều thời gian và tâm huyết. Thời gian đầu, để xây dựng các hệ GIS trong một thời hạn gấp rút, công nghệ mã nguồn mở không phù hợp. Nhưng trong tương lai, đây là một hướng phát triển có nhiều triển vọng.
            Trên cơ sở các phân tích trên, lựa chọn của chúng tôi là: Sử dụng công nghệ nền ESRI trong thời gian đầu để xây dựng các hệ thống GIS đòi hỏi thời hạn gấp rút, đồng thời qua quá trình sử dụng cần khai thác, học hỏi cách tổ chức lưu trữ, tổ chức truy vấn dữ liệu, tổ chức hiển thị bản đồ trên phần mềm khách, nhằm mục đích định hướng trong tương lai ứng dụng và phát triển mã nguồn mở OpenGIS.
            ESRI cung cấp cho nhà phát triển các giải pháp công nghệ sau đây để xây dựng một hệ thống GIS trên mạng WAN:
            - Công cụ ArcSDE (Spatial Database Engine) lưu trữ và quản trị dữ liệu không gian tích hợp vào các hệ quản trị CSDL quan hệ như Oracle, DB2, MS SQL Server...
            - Công cụ ArcIMS hỗ trợ xây dựng trang web GIS trên mạng
            - Thư viện cho ngôn ngữ Java và C lập trình giao dịch trên mạng, kết nối vào ArcSDE
            - OCX MapObject hỗ trợ lập trình giao diện GIS cho phần mềm khách theo công nghệ nhúng OLE trong môi trường Windows.
            Để xây dựng một hệ thống GIS trên mạng WAN bằng công nghệ của ESRI, chúng ta phải tiến hành hai bước chính. Bước thứ nhất là ứng dụng ArcSDE để xây dựng CSDL GIS đa người dùng. Công việc của giai đoạn này thuần tuý mang tính ứng dụng, vì vậy trong khuôn khổ bài báo này xin phép không đề cập đến. Bước thứ hai là phát triển phần mềm khách truy cập từ xa cho các tác nhân của hệ thống. Dưới đây chúng tôi sẽ nói về các kinh nghiệm của mình tích luỹ được khi xây dựng hệ thống GIS quản lý các công trình thuỷ lợi trên mạng WAN, ứng dụng cho hệ điều hành máy chủ là Windows 2000 Server và hệ điều hành các máy trạm là các phiên bản Windows khác nhau của Microsoft.
3. Lập trình giao dịch trên mạng với các hàm SDE C API
            Với các giải pháp mà ESRI cung cấp, ta có hai cách xây dựng phần mềm khách có khả năng truy cập từ xa vào CSDL. Hai cách này chỉ khác nhau ở phương pháp truy cập. Với cách thứ nhất, sử dụng ArcIMS xây dựng trang web GIS tạo thành lớp phần mềm trung gian (middleware). Trang web GIS này có chức năng đón nhận các yêu cầu từ các máy trạm gửi tới thông qua mạng Internet, chuyển các yêu cầu này đến ArcSDE và nhận kết quả xử lý từ ArcSDE trả lại cho máy trạm. Nhược điểm lớn nhất của phương pháp này là không thể cung cấp cho người dùng khả năng biên tập đối tượng đồ hoạ từ các máy trạm, và như vậy không đáp ứng được các yêu cầu đối với một hệ thống GIS trên mạng WAN mà chúng ta đã nêu trên.
            Phương pháp thứ hai là sử dụng thư viện SDE C API xây dựng phần mềm khách truy cập trực tiếp tới quản trị dữ liệu không gian ArcSDE trên máy chủ. Thư viện SDE C API cung cấp cho người phát triển đủ các hàm cần thiết để truy vấn, cập nhật dữ liệu thuộc tính và dữ liệu không gian, tìm kiếm các đối tượng dựa vào vị trí địa lý của nó trên bản đồ... Sau đây là các nhóm hàm của SDE C API:
            - Nhóm hàm thực hiện nhiệm vụ kết nối với CSDL
            - Nhóm hàm điều hành các luồng dữ liệu
            - Nhóm hàm quản trị cổng kết nối của ArcSDE
            - Nhóm hàm thống kê các CSDL trong hệ thống thông tin
            - Nhóm hàm quản lý thông tin về các lớp bản đồ
            - Nhóm hàm quản trị các lớp bản đồ
            - Nhóm hàm quản trị các tệp tăng tốc truy cập logfile
            - Nhóm hàm làm việc với các đối tượng đồ hoạ vectơ
            - Nhóm hàm làm việc với các bảng lưu giữ tạm thời các đối tượng đồ hoạ vectơ
            - Nhóm hàm làm việc với các bảng dữ liệu quan hệ
            - Nhóm hàm làm việc với cấu trúc lệnh SQL
            - Nhóm hàm quản lý các bảng điểm đồ hoạ
            - Nhóm hàm quản trị các thông tin về các hệ toạ độ của các lớp bản đồ.
            Với thư viện này, người lập trình có thể xây dựng phần mềm khách truy cập từ xa tới máy chủ và có các chức năng:
            - Kết nối trực tiếp tới quản trị dữ liệu không gian ArcSDE
            - Khởi tạo hoặc huỷ bỏ các luồng dữ liệu từ máy trạm tới máy chủ. Phần mềm khách cùng lúc có thể khởi tạo và vận hành nhiều luồng dữ liệu khác nhau. Đây là khả năng xử lý đa luồng rất quan trọng khi thực hiện các giao dịch trên mạng mà SDE C API cung cấp cho người lập trình
            - Khởi tạo hoặc xoá một lớp bản đồ trong CSDL trên máy chủ
            - Thêm hoặc bớt cột thuộc tính trong bảng dữ liệu quan hệ
            - Thay đổi dữ liệu thuộc tính trong CSDL
            - Thay đổi dữ liệu không gian (thay đổi toạ độ các điểm của đối tượng) trong CSDL
            - Thêm hoặc xoá đối tượng đồ hoạ trong CSDL
            - Tìm kiếm, thống kê các đối tượng đồ hoạ dựa vào vị trí địa lý của chúng, ví dụ như thống kê toàn bộ các con sông chảy qua địa phận một tỉnh
            - Thực hiện các phép toán hình học giữa các đối tượng như phép cộng, phép giao...
            Với các hàm của SDE C API, phần mềm khách có thể cho phép người dùng cuối không chỉ cập nhật dữ liệu thuộc tính, mà còn biên tập các đối tượng đồ hoạ từ máy trạm, sau đó cập nhật vào CSDL thông qua mạng Internet hoặc kết nối trực tiếp bằng chác quay số điện thoại (dial-up).

4. Lập trình giao diện bằng MapObject kết hợp với C++ trong môi trường VC++
            Sử dụng thư viện SDE C API để lập trình các giao dịch trên mạng với quản trị dữ liệu không gian ArcSDE, ta sẽ không bị ràng buộc trong việc lựa chọn cách xây dựng giao diện GIS cho phần mềm khách. Điều đó có nghĩa là ta có thể chọn một trong các thư viện thương mại như MapObject của ESRI, MapX của MapInfo hoặc GeoView của Blue Marble Geographics để lập trình giao diện cho phần mềm khách. Ta cũng có thể tự xây dựng các thư viện đồ hoạ phục vụ cho các mục đích đó. Để có căn cứ lựa chọn công cụ, ta xem xét các yêu cầu cơ bản mà giao diện GIS phần mềm khách cần phải đáp ứng. Xét về hình thức, giao diện GIS của phần mềm phải đáp ứng được hai chức năng chính: hiển thị bản đồ và hỗ trợ các thao tác của người dùng đối với bản đồ như thu, phóng tỷ lệ, xê dịch bản đồ, tìm kiếm đối tượng. Thông thường, bản đồ của các khu vực có thể có hệ quy chiếu toạ độ khác nhau, với các elipsoit thực dụng khác nhau, với các phép tính chiếu khác nhau. Để có thể hiển thị đồng thời các loại bản đồ như thế, phần mềm phải biết tính chuyển toạ độ và đưa các lớp bản đồ về một hệ quy chiếu chung trước khi hiển thị lên màn hình. Hỗ trợ thao tác của người dùng đối với bản đồ cũng liên quan đến bài toán tính chuyển toạ độ: xử lý, biến đổi toạ độ con chuột trên màn hình về hệ toạ độ chung của các lớp bản đồ và ngược lại. Có như vậy mới xác định được vị trí tương hỗ của con chuột và các đối tượng đồ hoạ trên bản đồ. Như vậy, xét về bản chất, hai chức năng chính của giao diện GIS là: a) Thực hiện tính chuyển toạ độ giữa các hệ quy chiếu, tính chuyển toạ độ con chuột trên màn hình về toạ độ trong hệ quy chiếu chung và ngược lại b) Hiển thị các đối tượng đồ hoạ lên màn hình.
            Xây dựng các hàm tính chuyển toạ giữa các hệ quy chiếu tương ứng với tất cả các elipsoit thực dụng và các phép tính chiếu hiện đang được sử dụng trong công nghệ bản đồ là một công việc rất phức tạp, không chỉ đòi hỏi sự hiểu biết sâu sắc về khoa học trắc địa-bản đồ, mà còn đòi hỏi nhiều công sức lập trình. Trong khi đó, lập trình hiển thị các đối tượng đồ hoạ trong môi trường các hệ điều hành phổ dụng ngày nay là điều khá dễ dàng. Vì vậy, khi lựa chọn thư viện để xây dựng giao diện GIS cho phần mềm khách, tiêu chí được chúng tôi ưu tiên là hỗ trợ tính chuyển toạ độ giữa các hệ quy chiếu. Trên cơ sở đó, MapObject được chọn như là công cụ chính để xây dựng giao diện GIS cho phần mềm khách.
            MapObject là thư viện OCX lập trình dựa theo công nghệ nhúng OLE trong môi trường Windows. ưu điểm lớn nhất của MapObject là cung cấp cho nhà phát triển các hàm chuyển đổi toạ độ giữa các hệ quy chiếu hiện đang phổ cập, giữa màn hình và bản đồ. Nhược điểm lớn nhất của MapObject là hầu như không hỗ trợ hiển thị các đối tượng đồ hoạ theo ký hiệu được quy định cho các loại bản đồ. Đến nay, ESRI đã phát triển MapObject đến phiên bản 8.3 và sau đó tích hợp vào thư viện với tên là ArcEngine. ArcEngine cho phép nhúng bản đồ vào các phần mềm có hỗ trợ công nghệ OLE, ví dụ như nhúng bản đồ vào văn bản trong MS Word. Một điểm mới nữa của ArcEngine là xử lý và hiển thị bản đồ 3 chiều nếu nó được cung cấp mô hình số độ cao. Nhưng khả năng hiển thị ký hiệu bản đồ vẫn không được cải thiện. Ngoài ra, một nhược điểm khác không kém phần quan trọng đối với những người lập trình bằng ngôn ngữ C/C++ là ESRI không có tài liệu hướng dẫn sử dụng MapObject với C/C++ mà chỉ có một số ví dụ. Trong khi đó, để sử dụng được thư viện SDE C API, ngôn ngữ lập trình xây dựng phần mềm khách không thể khác, ngoài C/C++.
            Để có thể đáp ứng được yêu cầu người dùng cuối đối với việc hiển thị các ký hiệu bản đồ theo đúng quy định lên màn hình, ta có thể kết hợp sử dụng MapObject với khả năng đồ hoạ của ngôn ngữ C/C++. Cách làm như sau.
            Như chúng ta đã biết, trong môi trường các hệ điều hành đồ hoạ, loại như Windows, OS/2, LINUX..., các phần mềm sử dụng vùng nhớ mô phỏng bộ nhớ màn hình để ghi chép hình ảnh cần hiển thị của mình, sau đó mới sao chép vùng nhớ mô phỏng này vào bộ nhớ vật lý của màn hình dưới sự điều hành của hệ thống. Có thể gọi vùng nhớ mô phỏng đó là vùng nhớ đệm. MapObject quản lý vùng nhớ đệm của mình độc lập với phần mềm ứng dụng, ứng với mỗi lớp bản đồ có một vùng nhớ đệm. Tuy vậy, trước khi sao chép vùng nhớ đệm vào bộ nhớ vật lý của màn hình, nó cho phép phần mềm ứng dụng ghi thêm hoặc thay thế nội dung của vùng hiển thị. Để nhận được địa chỉ của vùng nhớ đệm, ta gọi phương thức BeforeLayerDraw của MapObject. Sau đây là đoạn mã ví dụ được viết trong môi trường VC++, sử dụng cấu trúc Document-View của MFC. Đối tượng MapObject có tên là Map1 được nhúng vào lớp quan sát CMapView của phần mềm. Phần mềm gọi phương thức CMapView::OnBeforeLayerDrawMap1 để nhận con trỏ hDC trỏ tới vùng nhớ đệm dùng để hiển thị lớp bản đồ về các trạm bơm, gửi con trỏ đó đến hàm CMapView::VeBom để vẽ biểu tượng trạm bơm vào vùng nhớ.
           
            void CMapView::OnBeforeLayerDrawMap1(short index, long hDC)
            {
            //Lấy con trỏ đến lớp Document trong cấu trúc Document-View
            CNamSongMaDoc *pDoc= GetDocument()
           
            //Lấy tên của lớp bản đồ ứng với chỉ số index (ứng với con trỏ hDC)
            CMoLayers CollectionLayers(m_Map.GetLayers())
            CMoMapLayer CurrLayer(CollectionLayers.Item(COleVariant(index)))
            CString LayerName = CurrLayer.GetName()
           
            //Nếu là lớp bản đồ trạm bơm và đang ở trạng thái hiển thị thì gọi hàm vẽ các biểu tượng bơm
            if(!CurrLayer.GetVisible())
            {
            if(LayerName==pDoc-> ArrayStringTotalTenLop.GetAt
            (NumberOfTramBomTuoiLayer)
            {
            VeBom( index, (HDC)hDC,LayerName)
            }
            }
            }
           
            void CMapView::VeBom(short index, HDC hDC, CString MoLayerName)
            {
           
            //Tạo ra đối tượng tương thích chứa vùng nhớ đệm
            CDC DcMemory
            CDC dc
            dc.Attach(hDC)
            DcMemory. CompatibleDC(& dc)
            CMapDoc *pDoc =GetDocument()
            //Tạo ra hình vuông giới hạn vùng vẽ biểu tượng, cạnh là 100000 mm thực
            CSize DrawRectSize(100000,100000)
            //Đánh dấu tất cả các bản ghi trong lớp bản đồ trạm bơm
            CMoLayers CollectionLayers(m_Map.GetLayers())
            CMoMapLayer CurLayer(CollectionLayers.Item(COleVariant(index)))
            CMoRecordset myRecordset(CurLayer.GetRecords())
            //Chọn cột dữ liệu chứa đối tượng đồ hoạ
            CMoFields fields(myRecordset.GetFields())
            CMoField shapeField(fields.Item(COleVariant(TEXT("Shape"))))
            while (!myRecordset.GetEof())
            {
            //Lấy toạ độ trạm bơm
            CMoPoint MoPoint (shapeField.GetValue().pdispVal)
            CPoint DocPoint
            //Đổi toạ độ trạm bơm về hệ do Document quản lý
            MapToDoc(DocPoint,MoPoint)
            //Xác dịnh toạ độ của hình vuông giới hạn vùng vẽ biểu tượng
            DocPoint.x -= DrawRectSize.cx/2
            DocPoint.y -= DrawRectSize.cy/2
            CRect DrawRect(DocPoint,DrawRectSize)
            //Chuyển đổi về toạ độ và kích thước vùng vẽ về hệ của màn hình
            DocToClient(DrawRect)
            DrawRect.bottom +=1
            DrawRect.top -=1
            DrawRect.right +=1
            DrawRect.left -=1
            DrawRect.NormalizeRect()
           
            //Chuẩn bị bút vẽ
            LOGPEN m_logpen
            LOGBRUSH m_logbrush
            m_logpen.lopnStyle = PS_INSIDEFRAME
            m_logpen.lopnWidth.x = 2
            m_logpen.lopnWidth.y = 2
            m_logpen.lopnColor = RGB(0, 0, 0)
           
            //Chuẩn bị bút tô màu
            m_logbrush.lbStyle = BS_SOLID
            m_logbrush.lbColor = RGB(0, 0,0)
            m_logbrush.lbHatch = HS_HORIZONTAL
           
            //Vẽ hình vuông
            CPen pen
            if (!pen. PenIndirect(& m_logpen))
            return
           
            CBrush* pOldBrush
            CPen* pOldPen
            pOldBrush = (CBrush*)dc. StockObject(NULL_BRUSH)
            pOldPen = dc. Object(& pen)
            dc.Rectangle(DrawRect)
           
            dc. Object(pOldBrush)
            dc. Object(pOldPen)
           
            //Vẽ hình tròn bên trong
            int RectHeight=DrawRect.Height()
            CRect RectEllip = DrawRect
           
            RectEllip.TopLeft().x +=RectHeight/10
            RectEllip.TopLeft().y +=RectHeight/10
            RectEllip.BottomRight().x -=RectHeight/10
            RectEllip.BottomRight().y -=RectHeight/10
            RectEllip.NormalizeRect()
            m_logpen.lopnWidth.x = 1
            m_logpen.lopnWidth.y = 1
            m_logbrush.lbColor = RGB(255, 255,255)
            CBrush brush1
            if (!brush1. BrushIndirect(& m_logbrush))
            {
            return
            }
           
            m_logpen.lopnWidth.x = 1
            m_logpen.lopnWidth.y = 1
            CPen pen1
            if (!pen1. PenIndirect(& m_logpen))
            {
            return
            }
           
            pOldBrush= dc. Object(& brush1)
            pOldPen = dc. Object(& pen1)
            dc.Ellipse(RectEllip)
            dc. Object(pOldBrush)
           
            //Vẽ nửa vòng tròn đỏ bên trái
            m_logbrush.lbColor = RGB(255, 0,0)
            CBrush brushXord
            if (!brushXord. BrushIndirect(& m_logbrush))
            {
            return
            }
            pOldBrush= dc. Object(& brushXord)
           
            CPoint StartPoint((RectEllip.left+RectEllip.right)/2,RectEllip.bottom)
            CPoint EndPoint((RectEllip.left+RectEllip.right)/2,RectEllip.top)
            dc.Chord(RectEllip,StartPoint,EndPoint)
           
            dc. Object(pOldBrush)
            dc. Object(pOldPen)
           
            myRecordset.MoveNext() //Chuyển đến bản ghi sau để vẽ trạm bơm tiếp theo
            }
            dc.Detach() //Giải phóng vùng nhớ đệm
            }
            Bằng phương pháp này, ta có thể vẽ bất cứ loại đối tượng đồ hoạ nào vào lớp bản đồ mà ta muốn, thậm chí có thể hoàn toàn thay thế chức năng vẽ bản đồ của MapObject bằng các hàm ta tự xây dựng lấy. 
5. Tối ưu hoá truyền tải dữ liệu không gian trên mạng            Xây dựng hệ thống GIS trên mạng WAN, vấn đề đầu tiên cần phải quan tâm là giảm thiểu truyền tải dữ liệu không gian trên mạng. Thông thường, dung lượng dữ liệu không gian bao giờ cũng lớn gấp nhiều lần dung lượng dữ liệu thuộc tính. Nếu trao đổi thường xuyên dữ liệu không gian trên mạng, đường truyền sẽ bị quá tải, người dùng sẽ không chấp nhận. Chúng ta cũng có thể thấy là, so với dữ liệu thuộc tính, dữ liệu không gian ít biến đổi hơn. Ví dụ như địa giới hành chính tỉnh, huyện, xã chẳng hạn, hầu như cố định trong một thời gian khá dài. Chỉ có một số ít lớp bản đồ dùng để quan sát các hiện tượng tự nhiên có thể có những thay đổi nhanh trong một khoảng thời gian nhất định, ví dụ như lớp bản đồ vùng ngập úng trong mùa lũ. Dựa vào đặc điểm đó, chúng tôi sử dụng giải pháp giảm thiểu truyền tải dữ liệu không gian trên mạng, trong đó dùng các tệp Shapefile như là tệp ghi tạm thời trên các máy trạm. Giải pháp đó có thể mô tả như sau.
            Dữ liệu không gian chỉ đọc một lần từ máy chủ về máy trạm, và được ghi thành Shapefile trên máy trạm. Mỗi lớp bản đồ trên máy chủ ứng với một shapefile. Trong shapefile chỉ lưu giữ cấu trúc hình học của các đối tượng đồ hoạ (toạ độ của các điểm cấu tạo nên đối tượng) và mã số ID của các đối tượng trong CSDL trên máy chủ. Trong mỗi lần giao dịch sau này, phần mềm sẽ đối chiếu ID của các đối tượng trong shapefile và ID trong lớp tương ứng trong CSDL trên máy chủ. Nếu đối tượng đã bị xoá khỏi CSDL, nó sẽ bị xoá khỏi shapefile tương ứng. Ngược lại, nếu trong CSDL xuất hiện đối tượng mới, nó sẽ được đọc về và bổ sung vào shapefile tương ứng. Shapefile chỉ phục vụ cho mục đích hiển thị bản đồ trên màn hình. Mọi việc truy vấn, tìm kiếm thông tin đều thực hiện trong CSDL trên máy chủ. Lưu trữ shapefile trên máy trạm hoàn toàn không ảnh hưởng tới công tác bảo mật thông tin và bảo toàn dữ liệu trên máy chủ.
6. Xây dựng công cụ biên tập đồ hoạ cho phần mềm khách
            MapObject cung cấp cho người phát triển một vài khả năng biên tập dữ liệu đồ hoạ, sử dụng lớp TrackingLayer làm lớp tạm thời chứa các đối tượng đồ hoạ đang được biên tập trước khi cập nhật chúng vào lớp bản đồ tương ứng trong CSDL. Nhưng các khả năng này rất hạn chế và hoàn toàn không đáp ứng được yêu cầu đối với một phần mềm cần có chức năng biên tập dữ liệu bản đồ. Để đáp ứng được yêu cầu này, cần phải kết hợp lập trình đồ hoạ trong Windows với khả năng hiển thị đồ hoạ của MapObject. Trong trường hợp sử dụng môi trường lập trình VC++, chúng tôi làm như sau:
            - Sử dụng vùng nhớ đệm của lớp TrackingLayer để vẽ các đối tượng đang được biên tập. Cách sử dụng tương tự như sử dụng lớp bản đồ khác để vẽ các biểu tượng như đã trình bày ở trên
            - Xây dựng các lớp trong C++ thực hiện việc biên tập các đối tượng đồ hoạ. Điều đáng quan tâm nhất khi xây dựng các lớp này là việc chuyển đổi, quản lý toạ độ các điểm cấu tạo nên các đối tượng được biên tập. Cụ thể là khi biên tập, toạ độ của điểm thuộc đối tượng do con chuột vạch ra trên màn hình phải được chuyển đổi về hệ chung cho tất cả các lớp bản đồ, và trước khi hiển thị đối tượng lên màn hình, toạ độ của các điểm thuộc đối tượng lại được chuyển đổi về hệ toạ độ của cửa sổ phần mềm khách. Làm như vậy, vị trí tương hỗ giữa các đối tượng đang được biên tập và các đối tượng đã có trong CSDL sẽ không bị thay đổi khi người dùng phóng to, thu nhỏ hoặc di chuyển các lớp bản đồ.
            Sau khi đối tượng được biên tập, được cập nhật vào lớp bản đồ nào đấy, toạ độ của các điểm thuộc đối tượng phải được tính chuyển về hệ quy chiếu của lớp bản đồ đó.
7. Kết luận            Cách tiếp cận được trình bày trên đây đã được chúng tôi sử dụng để xây dựng hệ thống thông tin quản lý các công trình thuỷ lợi trên mạng WAN. Trong hệ thống này, CSDL được đặt trên máy chủ tại Hà Nội. Các tỉnh, huyện, các công ty quản lý các công trình thuỷ lợi tại các địa phương được cung cấp phần mềm khách truy vấn, cập nhật dữ liệu từ xa thông qua phương pháp kết nối trực tiếp vào số điện thoại trên máy chủ. Những cơ quan, đơn vị này sẽ là những nơi trực tiếp cập nhật dữ liệu, bổ sung các công trình mới được xây dựng vào hệ thống. Hiện nay, phần mềm đã được chuyển giao cho các địa phương ở một số tỉnh trong nước.
            Kinh nghiệm xây dựng hệ thống, các kiến thức thu hoạch được trong quá trình tiếp cận công nghệ của ESRI sẽ là cái vốn hết sức quan trọng để chúng tôi chuyển sang giai đoạn nghiên cứu ứng dụng mã nguồn mở OpenGIS. 
                     

(Tác giả: TSKH Nguyễn Đăng Vỹ, Trung tâm Công nghệ phần mềm Thuỷ lợi
Viện Khoa học Thuỷ lợi)
Share on :