Trang

Thứ Tư, 25 tháng 4, 2012

Hiển thị dữ liệu PostgreSQL - PostGIS trong Pmapper


PostgreSQL và PostGIS có thể tải tại trang chủ của chúng. Người dùng chỉ việc vào Google vào gõ vào chữ PostgreSQL hoặc PostGIS sẽ dễ dàng tìm thấy trang chủ của chúng. Có nhiều phiên bản PostgreSQL cũng như nhiều phiên bản PostGIS. Ở trên các trang web đó có ghi cụ thể phiên bản nào của PostGIS có thể dùng với phiên bản nào của PostgreSQL. Nghe có vẻ phức tạp, nhưng trên trang web sẽ cung cấp thông tin đầy đủ cho người dùng. Tôi thì quen dùng PostgreSQL 8.2 và phiên bản PostGIS 1.4. À mà để đơn giản khi cài đặt, người dùng nên tải các gói exe trên Windows. Khi đó bạn chỉ việc Click Next, khai báo các thông số và cài đặt. Nếu ai muốn thử thách hơn chút thì tải gói binary về cài. Hướng dẫn thường đi kèm theo file tải về. Đối với các phiên bản PostgreSQL 8.3 trở lên thì cài đặt đơn giản hơn, còn đối với phiên bản 8.2 đòi hỏi ổ đĩa cài đặt phải ở NTFS. Thường thì ổ đĩa của bạn ở FAT32 hay FAT, muốn chuyển sang NTFS cũng đơn giản thôi. Vào Start/Run. Gõ lệnh cd/ để trở về thư mục gốc là ổ C. Gõ vào lệnh convert C:/fs:NTFS. Tiếp theo, sẽ yêu cầu bạn nhập các chữ Y là Yes hoặc N là No. Sau khi hoàn tất khởi động lại máy, đợi máy tự chuyển đổi là xong. Sau đó, cài PostgreSQL bình thường. Sau đó cài PostGIS.
Sau khi cài đặt xong, người dùng có thể vào pgAdmin III để kiểm tra kết quả. Gaio diện như sau
Như hình trên, khi cài PostGIS tôi tạo CSDL tayninh, bạn nhìn chỗ Functions, nó có 684 hàm, điều đó có nghĩa là PostGIS đã cài đặt thành công, các hàm đó là các hàm hỗ trợ xử lý các vấn đề liên quan đến đối tượng không gian.
Vấn đề bây giờ là đưa dữ liệu vào CSDL và hiển thị dữ liệu đó lên Pmapper. Ở đây tôi sử dụng dữ liệu shapefile đưa vào CSDL. Trong CSDL, nó lưu tất cả các đối tượng kể cả đối tượng không gian ở dạng text. Do đó, cần chuyển đổi các đối tượng này sang dạng text (.sql). Mở cửa sổ Command Prompt của PostgreSQL lên. Sử dụng lệnh sau để chuyển shapefile sang file .sql
shp2pgsql –D –c huyen huyen > huyen.sql
Với shapefile cần chuyển tên là huyen và nằm trong thư mục bin của PostgreSQL, nếu file nằm ở vị trí khác thì chỉ việc thêm đường dẫn trước tên file.
Khi đã có file huyen.sql, chỉ việc gõ vào dòng lệnh :
Psql –d tayninh –U postgres –f  huyen.sql
Dữ liệu sẽ được đưa vào trong CSDL tayninh.
Ở các phiên bản sau này của PostGIS, nó có hỗ trợ công cụ để đưa shapefile trực tiếp vào CSDL, người dùng chỉ việc Add shapefile vào, khai báo kết nối với CSDL và Import.
Thường tôi cài QuantumGIS (QGIS) để kiểm ra việc kết nối với CSDL, nếu bạn có cài QGIS thì có thể sử dụng nó để đưa shapefile vào CSDL.
Sau khi đã đưa dữ liệu vào thành công, bạn sẽ thấy tên dữ liệu của mình trong phần Tables, như ở hình trên, dữ liệu của tôi có tên là huyen.
Để pmapper có thể lấy dữ liệu trong CSDL hiển thị lên web thì đòi hỏi phải khai báo kết nối trong mapfile. Việc khai báo cũng rất đơn giản.
LAYER
  NAME "huyen"
  CONNECTIONTYPE POSTGIS
  CONNECTION "user=postgres password=nhatsinh dbname=tayninh host=localhost port=5432"
  DATA "the_geom from huyen USING UNIQUE gid"
  STATUS ON
  TYPE polygon
END

Chỗ CONNECTIONTYPE khai báo là postgis do dữ liệu được lấy từ đó. CONNECTION khai báo chuỗi kết nối bao gồm user, password, tên CSDL (dbname), host, port. Phần DATA khai báo cột chứa dữ liệu không gian, thường là cột the_geom (hoặc geom trong các phiên bản PostGIS sau này). USING UNIQUE gid là sử dụng gid để tăng tốc độ load dữ liệu. gid là trường khóa mặc địng khi bạn đưa shapefile vào CSDL. Để thể hiện mỗi huyện một màu và tên mỗi huyện, tôi thực hiện như đã đề cập ở phần trước. Kết quả như sau :
Kinh nghiệm : quá trình thực hiện như trên khá đơn giản. Nhưng tôi lại mất khá nhiều thời gian do gặp phải một vấn đề. Tôi sử dụng PostgreSQL phiên bản 9.1 và PostGIS 2.0 để kết nối với Mapserver 3.0.4. Trong Postgis 2.0 không còn hỗ trợ hàm geofromtext. Mà hàm này được sử dụng để vẽ đối tượng không gian từ text lưu trong CSDL, không có nó, các đối tượng không gian không được vẽ ra, và kết quả là pmapper không hiển thị được các huyện. Tôi kiểm tra kết nối, kiểm tra CSDL (bằng QGIS như tôi đã nói), kiểm tra mapfile nhưng không tìm được lỗi. Có lúc tưởng như bó tay, tôi chợt nhớ đến việc Mapserver có báo cáo lỗi cho người dùng thông qua file ms_error.txt. Người dùng chỉ việc khai báo dòng lệnh sau trong mapfile.

CONFIG "MS_ERRORFILE" "/ms4w/tmp/ms_error.txt"

Chỉ việc mở file đó lên xem, tôi đã phát hiện lỗi, vui mừng khó tả ^_^
NNS

1 nhận xét:

  1. Em/cháu chào anh/chú . Hiện tại cháu đang làm Khóa luận hiển thị dữ liệu và thiết lập công cụ chức năng trên p.mapper, lấy dữ liệu từ pgadmin III. Tài liệu trên mạng thì không đầy đủ mà cháu có rất nhiều thắc mắc muốn được giải đáp. Nếu chú đọc được cmt này chú có thể cho cháu hỏi chú một số vấn đề được không ạ. Cháu cảm ơn chú. Chúc chú thành công.

    Trả lờiXóa