Wednesday, December 11, 2013

Import shapefile vào Oracle


Quách Đồng Thắng 
Trung tâm Ứng dụng GIS Tp.HCM

1.     GIỚI THIỆU

    Hệ quản trị CSDL Oracle là một trong những lựa chọn hàng đầu trong các hệ thống thông tin, đặc biệt đối với các hệ thống lớn. Oracle hiện hỗ trợ rất tốt trong việc quản lý dữ liệu vector, raster, 3D, point cloud (dữ liệu LiDAR),...
    Mở đầu trong loạt bài về vấn đề quản lý dữ liệu không gian trong Oracle, bài viết trình bày cách import shapefile vào Oracle bằng 02 cách:
    -     Sử dụng SQL Loader với sự hỗ trợ của công cụ shp2sdo.
    -     Sử dụng GeoRaptor plugin trong Oracle SQL Developer.

    2.     THỬ NGHIỆM

      2.1     Cài đặt các công cụ cần thiết

      -     Cài đặt Oracle SQL Developer để quản trị CSDL Oracle.
      -     Cài đặt tiện ích shp2sdo để chuyển đổi shapefile vào CSDL Oracle.
      -     Cài đặt plugin GeoRaptor để tương tác với dữ liệu không gian trong SQL Developer.
      -     Cài đặt phần mềm QGIS để kiểm tra kết quả.

      2.2     Sử dụng công cụ shp2sdo

      Oracle cung cấp hai công cụ để làm việc với CSDL Oracle là SQL*Plus (giao diện dòng lệnh) và công cụ giao diện đồ họa SQL Developer. Chúng ta sẽ sử dụng SQL Developer để thử nghiệm.
      -     Khởi động SQL Developer, đăng nhập với tài khoản system (với password được thiết lập ở bước cài đặt SQL Developer).

      -     Để sử dụng database hr (CSDL human resource - được xây dựng sẵn), sau khi đăng nhập thành công, vào Other Users --> hr --> chọn edit user, đặt password cho user hr (giả sử password cũng là ‘hr’), uncheck Password expired và Account is Locked. 

      -     Sau khi đăng nhập lại bằng user hr sẽ thấy các table mô phỏng một CSDL quản lý nhân sự như departments, employees,… đã được tạo sẵn. Chúng ta sẽ thử nghiệm trên database mẫu này.

      -     Để import shapefile vào database hr, thực thi shp2sdo.exe (trong giao diện cmd), nhập vào các thông tin cần thiết, quan trọng là tên shapefile (ví dụ rt_q1), tên table cần tạo và SRID (ví dụ ở đây chọn SRID 32648)

      -     Kết quả có 03 file được tạo ra:
      rt_q1.sql: chứa lệnh sql tạo table rt_q1.
      rt_q1.ctl:  control file phục vụ load dữ liệu từ shapefile vào table rt_q1 bằng công cụ SQL Loader.
      rt_q1.dat: chứa dữ liệu thuộc tính và không gian của shapefile rt_q1. 

      -     Chạy file rt_q1.sql trong SQL Developer để tạo table rt_q1

        -     Quan trọng: dể bảo toàn unicode tiếng Việt, không bị lỗi font, thêm dòng “CHARACTERSET UTF8” vào sau dòng LOAD DATA trong file rt_q1.ctl:

        -     Tiếp theo, ở giao diện cmd, thực thi lệnh sql loader để load dữ liệu vào table rt_q1 vừa tạo.
        >sqlldr hr/hr@localhost control=rt_q1.ctl
        (cấu trúc câu lệnh là sqlldr username/password@DBhost   control=control file)
        -     Nếu dữ liệu dạng polygon, chạy dòng lệnh sau trong SQL Developer:
        EXECUTE SDO_MIGRATE.TO_CURRENT('RT_Q1','GEOM');
        -     Kết quả sau khi load data (Trong SQL Developer, vào menu View --> Map View để hiển thị dữ liệu không gian): 

        -     Kết nối với CSDL Oracle từ QGIS: vào menu Layer --> Add Oracle Spatial Layer, nhập các thông số kết nối:

        -     Kết quả:


        2.3     Sử dụng công cụ GeoRaptor

        -     Ở giao diện SQL Developer, vào View --> GeoRaptor --> Load shapefile, nhập các thông số cần thiết:

        -     Tuy nhiên, công cụ GeoRaptor không hỗ trợ tốt unicode tiếng Việt. 

        -     Để giải quyết vấn đề lỗi font, chúng ta có thể sử dụng “mẹo” như sau:    

        Đầu tiên, tạo một phiên bản shapefile với chỉ một record (rt_q1) và sử dụng GeoRaptor load       Shapefile này vào database. Mục đích để tạo table có thể quản lý dữ liệu không gian và giảm thời gian load dữ liệu.
        Sau đó sử dụng QGIS để kết nối đến table rt_q1 vừa tạo, đồng thời load shapefile rt_q1. Tiếp theo bật chế độ edit cho table rt_q1 và dùng chức năng copy & paste dữ liệu từ shapefile sang table.

                  3.     KẾT LUẬN

                    Bài viết đã trình bày cách load shapefile vào CSDL Oracle theo hai cách tiếp cận khác nhau. Kết quả thử nghiệm cho thấy, GeoRaptor hỗ trợ giao diện đồ họa thuận tiện hơn so với shp2sdo, nhưng có nhược điểm là người dùng khó can thiệp vào các tham số khi chuyển đổi, dẫn đến mất thời gian giải quyết như vấn đề unicode tiếng Việt đã đề cập ở trên.

                    Monday, November 11, 2013

                    Xây dựng tim đường từ dữ liệu vùng

                    Quách Đồng Thắng 
                    Trung tâm Ứng dụng GIS TP.HCM

                    TÓM TẮT

                                Bài báo trình bày phương pháp xây dựng tim đường cho dữ liệu dạng vùng theo các cách tiếp cận khác nhau, phục vụ làm dữ liệu đầu vào cho các bài toán phân tích mạng và vấn đề gán nhãn cho đối tương dạng vùng phức tạp trong các ứng dụng GIS.

                    Từ khóa: tim đường, tìm xương, sơ đồ Voronoi, phân tích mạng, gán nhãn.

                     1.  GIỚI THIỆU

                                Trong quá trình số hóa, cập nhật dữ liệu, đôi khi chúng ta cần giải quyết bài toán rất cơ bản là xây dựng tim đường (centerline) cho dữ liệu dạng vùng (polygon) có cấu trúc mạng lưới (network) như hệ thống giao thông, sông suối, hệ thống cấp - thoát nước,... Công đoạn này có rất nhiều ứng dụng trong thực tế. Ví dụ, xét bài toán tìm đường đi ngắn nhất với dữ liệu đầu vào chỉ có lớp giao thông dạng vùng. Công việc đầu tiên là phải tạo lớp tim đường, sau đó mới có thể xây dựng cấu trúc node - edge để build network cho bài toán tìm đường.
                                Ngoài ra, đối với dữ liệu dạng vùng, vấn đề gán nhãn – labeling là bài toán khó trong việc hiển thị nhãn theo ngữ cảnh và theo dáng điệu của polygon, đặc biệt là đối với các polygon phức tạp. Vấn đề này có thể được giải quyết bằng cách gán nhãn dựa trên centerline/ media axis của đối tượng polygon.
                                Nói  rộng ra, bài toán tìm centerline thuộc lớp bài toán tìm media axis/ skeleton cho đối tượng hình học, được ứng dụng rất nhiều trong thực tế như shape matching, animation, motion planning,... Vấn đề đặt ra là có thể tự động hóa công đoạn này hay không và cách tiếp cận giải quyết bài toán này như thế nào, đặc biệt trong các phần mềm, ứng dụng GIS. Đó cũng là mục tiêu nghiên cứu của bài báo.
                    Hình 1: Labeling dựa trên centerline

                                Trở lại bài toán tìm centerline cho polygon, có thể phân thành 02 nhóm phương pháp - tạm gọi là phương pháp vector và phương pháp raster. Phương pháp vector giới thiệu trong bài báo dựa trên sơ đồ Voronoi. Phương pháp raster chuyển dữ liệu vùng (dạng vector) về dạng raster rồi thực hiện các thuật toán thinning để xây dựng tim đường cho đối tượng.

                    1.1.  Phương pháp vector dựa trên sơ đồ Voronoi

                                Trước tiên, bài báo trình bày một số khái niệm về sơ đồ Voronoi (còn được gọi là đa giác Thiessen) và khả năng ứng dụng trong bài toán tìm centerline cho polygon.
                                Về cơ bản, sơ đồ Voronoi cho một tập hợp điểm được định nghĩa như sau:
                                -   Cho P = {p1,p2,p3,…,pn} là tập n điểm trong không gian Euclidean.
                                -   d(pi,pj): Khoảng cách Euclidean giữa pi và pj.
                                -   Ô Voronoi của pi – kí hiệu V(pi) được định nghĩa:

                                V(pi) = { q : d(pi, q) < d(pj, q), với ∀ j ≠ i }

                                -   Sơ đồ Voronoi của tập điểm P, kí hiệu V(P) là hợp các ô Voronoi của tất cả các điểm thuộc P.
                                Nói cách khác, sơ đồ Voronoi là một phân hoạch của P thành n vùng, mỗi vùng ứng với một và chỉ một điểm pi thuộc P sao cho nếu  điểm q thuộc vùng ứng với pi thì khoảng cách từ q đến pi là nhỏ nhất so với các điểm khác thuộc P.
                    Hình 2: Sơ đồ Voronoi 

                                Dễ thấy các cạnh của sơ đồ Voronoi chính là đường trung trực của các cặp điểm kề nhau. Dựa vào tính chất này, nếu chúng ta xây dựng sơ đồ Voronoi cho các điểm biên của polygon thì có thể lọc được centerline của nó từ các cạnh của sơ đồ Voronoi. Đây cũng chính là ý tưởng cơ bản của phương pháp vectorxây dựng centerline từ polygon dựa trên sơ đồ Voronoi.
                    Hình 3: Sơ đồ Voronoi các điểm biên của Polygon

                    1.2.  Phương pháp raster

                                Phương pháp raster chuyển dữ liệu vùng (dạng vector) về dạng raster rồi thực hiện các thuật toán thinning để xây dựng tim đường cho đối tượng.

                     2.  ÁP DỤNG

                                Một số công cụ hỗ trợ xây dựng centerline ở mức người dùng cuối (trong phần mềm thương mại ArcGIS):
                                -   Số hóa thủ công với sự trợ giúp của công cụ Midpoint. Nhược điểm là chậm và nhàm chán. Ưu điểm là người dùng có thể tinh chỉnh ngay trong giai đoạn số hóa tùy theo ngữ cảnh thực tế và tận dụng được kinh nghiệm của biên tập viên dữ liệu.
                    Hình 4: Số hóa centerline thủ công với công cụ Midpoint

                                -   Collapse Dual Lines To Centerline: Đây là chức năng được tích hợp sẵn trong Cartography Tools/ Generalization. Để sử dụng chức năng này phải chuyển lớp polygon sang line. Tuy nhiên công cụ này có hiệu quả thấp, chỉ phù hợp với mạng giao thông (polygon tương đối thẳng và không qua phức tạp), và rất khó sử dụng vì phải nhập thông số Maximum width thích hợp mới cho kết quả chấp nhận được.
                                -   Sử dụng chức năng Create Centerlines của công cụ ET GeoWizards. Tuy nhiên đây là extension có bản quyền.
                    Hình 5: Chức năng Create Centerline trong ET GeoWizards

                                Trên đây là các công cụ hỗ trợ người dùng cuối tạo centerline cho polygon trong phần mềm ArcGIS. Có thể thấy, hai phương pháp đầu là thủ công, phương pháp thứ ba sử dụng extension thương mại nên cũng khó tiếp cận nghiên cứu phương pháp, thuật toán thực sự được cài đặt bên dưới là gì.
                                Trên cơ sở phân tích các phương pháp ở phần 1, bài báo sẽ tập trung hiện thực hóa ý tưởng, phương pháp xây dựng centerline cho polygon trong phần mềm ArcGIS, cũng như cho các phần mềm GIS khác.

                    2.1.  Hiện thực phương pháp vector dựa trên sơ đồ Voronoi

                                Ý tưởng thuật toán trên được áp dụng trong ArcGIS bằng cách sử dụng các công cụ sẵn có theo các bước sau:
                                -   Đầu tiên chuyển các vertices của polygon thành lớp điểm riêng bằng công cụ Feature Vertices to Points trong Data Management Tools/ Features. Để nâng cao chất lượng khi tạo centerline, có thể tăng mật độ các vertice của polygon (sử dụng chức năng Editing Tools/ Densify). Lưu ý nếu tạo mật độ điểm càng dày, độ chính xác càng cao nhưng thời gian tính toán càng tăng. Bài báo thực hiện densify polygon với khoảng cách giữa các vertices là 1m.
                    Hình 6: Tăng mật độ điểm biên bằng Densify

                                -   Tiếp theo, tạo Thiessen trong Analysis Tools/ Proximity/ Create Thiessen polygon.
                    Hình 7: Tạo Thiessen polygon cho lớp điểm

                                -   Sau đó chuyển Thiessen Polygon vừa tạo thành lớp line, dùng Select By Location để lọc những đường nằm trong polygon. Đến đây centerline đã dần lộ diện.
                    Hình 8: Lọc centerline từ các cạnh Voronoi

                                -   Để tinh chỉnh kết quả thành centerline như mong muốn, có thể xóa thủ công các nhánh không cần thiết hoặc tiếp tục sử dụng các kĩ thuật lọc khác. Công đoạn cuối cùng là merge tất cả các line lại thành một centerline duy nhất.
                                Chúng ta có thể sử dụng ModuleBuilder trong ArcGIS để thiết kế và chạy tự động các bước trên, hoặc có thể sử dụng công cụ Polygon to Centerline được publish trên Arcgis Resource Center dưới dạng một toolbox. Công cụ có 02 chức năng là tạo centerline và hiệu chỉnh centerline, áp dụng phương pháp vector dựa trên sơ đồ Voronoi như đã phân tích trong phần 1 của bài báo.
                    Hình 9: Toolbox Polygon to Centerline

                                Ngoài ArcGIS, cách tiếp cận này cũng đã được sử dụng để tìm centerline cho đối tượng dạng vùng trên CSDL PostGIS bằng cách sử dụng các hàm xử lý dữ liệu không gian của PostGIS và hàm Voronoi của R thông qua ngôn ngữ PL/R. Cách tiếp cận này cũng được cài dặt trên thư viện geoscript chạy trên nền Jython.
                                Bài báo trình bày cách xây dựng sơ đồ  Voronoi, làm cơ sở để tìm tim đường cho đối tượng dạng vùng trong PostGIS. Một số công cụ/ phần mềm được sử dụng:
                                -   R: phần mềm mã nguồn mở hỗ trợ phân tích thống kê và hiển thị đồ họa mạnh mẽ.
                                -   PL/R: một phần mở rộng của PostgreSQL cho phép viết các hàm PostgreSQL bằng ngôn ngữ R.
                                -   Deldir package (Delaunay Triangulation and Dirichlet (Voronoi) Tessellation) của tác giả Rolf Turnerhỗ trợ xây dựng Voronoi diagram/ Delaunay Triangulation từ một tập điểm.
                                Giải pháp đưa ra là sử dụng function được viết bằng PL/R trong PostgreSQL/PostGIS sử dụng gói deldir trong R để xây dựng sơ đồ Voronoi cho tập điểm là các vertices của polygon, kết hợp dùng các hàm xử lý dữ liệu không gian trong PostGIS để trích lọc tim đường cho polygon. Cụ thể:
                                -   Sử dụng hàm ST_Boundary để trích xuất biên của polygon ở dạng line.  
                                -   Sử dụng hàm ST_Line_Interpolate_Point để tạo tập điểm từ polygon boundary với mật độ tuỳ ý.
                    Hình 10: Tạo Voronoi Diagram trong PostGIS bằng hàm PL/R

                    2.2.  Hiện thực phương pháp raster

                                Cách tiếp cận thứ hai là chuyển dữ liệu sang raster. Cách tiếp cận này được sử dụng nhiều trong lĩnh vực xử lý ảnh và thị giác máy tính.
                                Trong ArcGIS, chúng ta có thể hiện thực bằng các bước sau:
                                -   Chuyển polygon sang raster:
                    Hình 11: Công cụ Polygon to Raster

                                -   Dùng công cụ Thin trong Spatial Analysis Tools/Generalization để tạo centerline, sau đó  dùng công cụ Raster to Polyline để có được lớp tim đường dạng vector.
                    Hình 12: Kết quả tạo tim đường giao thông

                    3.  KẾT LUẬN

                                Bài báo đã giới thiệu cách tiếp cận xây dựng centerline cho polygon và hiện thực hóa trong phần mềm ArcGIS cũng như giới thiệu một số cài đặt trên các môi trường khác như PostGIS hoặc geoscript. Việc lựa chọn công cụ nào tùy thuộc vào nhu cầu sử dụng thực tế của người dùng. Các cách tiếp cận được đề cập trong bài báo mang tính giới thiệu để các nhà nghiên cứu có quan tâm tiếp tục nâng cao chất lượng tạo tim đường cho đối tượng dạng vùng hoặc đề xuất các hướng tiếp cận khác để giải quyết vấn đề này.


                    TÀI LIỆU THAM KHẢO
                    1.    Boissonnat, J.-D. (January 2010). Convex Hulls, Voronoi Diagrams and Delaunay Triangulations. ENS-Lyon.
                    2.    Francis Chin, Jack Snoeyinky, Cao An Wangz. Finding the Medial Axis of a Simple Polygon.
                    3.    Franz Aurenhamme, Rolf Klein. Voronoi Diagrams.
                    4.    Goswami, P. P. Introduction to Computational Geometry.
                    5.    Inkulu, R. Voronoi diagrams: Higher order.
                    6.    Kreveld, M. v. Computational Geometry: its objectives and relation to GIS.
                    7.    LLeo Hsu and Regina Obe. (n.d.). bostongis. Retrieved from PL/R and PostGIS:
                           http://www.bostongis.com/?content_name=postgresql_plr_tut02#98
                    8.    Mark de Berge, Otfried Cheong, Marc vn Kreveld, Mark Overmars. (2008). Computational Geometry -  
                           Algorithms and applications. Springer.           
                    9.    Nandy, S. C. Voronoi Diagram.
                    10.   Nehab, D. Medial Axis.
                    11.   Edwards, R. (2010). Determining the Skeleton of a Simple Polygon in (Almost) Linear Time. Oak Ridge,
                            Tennessee. 
                    12.   Joachim Giesen, B. M. The Scale Axis Transform.
                    13.   M.Ilg, R. O. (1992). Voronoi Skeletons: Theory and Applications. CVPR'92, (pp. 63-69). Illinois.
                    14.   Michael McAllister, J. S. media axis generalisation of hydrology. Vancouver, BC, Canada, V6T 1Z4:      
                            Department of Computer Science, University of British Columbia.
                    15.   A Geospatial World. (n.d.). Retrieved 08 2013, from Voronoi diagram of the polygon skeletonization:    
                            http://ageoguy.blogspot.com/search?q=voronoi 
                    16.   ArcGIS Resource Center. (n.d.). Retrieved 07 2013, from Polygon to Centerline:
                            http://resources.arcgis.com/gallery/file/geoprocessing/details?entryID=EF0C96FF-1422-2418-7F9F-               B0A8839FC796       
                    17.    ArcGIS tools add-ons and extensions from ET SpatialTechnique. (n.d.). Retrieved 08 2013, from
                            http://www.ian-ko.com/                  
                    18.   Smathermather's Weblog. (n.d.). Retrieved 6 2013, from What is the center line of a complex polygon?:
                            http://smathermather.wordpress.com/2011/09/16/what-is-the-center-line-of-a-polygon-or-how-to

                    Tuesday, October 29, 2013

                    Phát triển ứng dụng GIS với Python

                    Quách Đồng Thắng 
                    Trung tâm Ứng dụng GIS Tp.HCM

                    Abstract: This paper introduces the Python language, the role of Python in existing GIS software, the Python GIS libraries support developing GIS applications. The paper also presents a case study of building Python WebGIS application based on django framework using eclipse IDE with pydev extension. 
                    Keywords: Python, GeoDjango, eclipse, Pydev, PostGIS.

                    1.   GIỚI THIỆU
                         Python là một ngôn ngữ lập trình kịch bản (scripting), thông dịch (interpreter) thích hợp cho nhiều loại ứng dụng trên nhiều platform khác nhau. Trong lĩnh vực GIS, phần lớn các phần mềm GIS hiện nay sử dụng Python làm ngôn ngữ scripting và để xây dựng các extension; các thư viện lập trình GIS thường có Python binding để có thể dễ dàng sử dụng trên môi trường Python.

                    Cách tiếp cận lập trình GIS với Python:

                    • Sử dụng scripting language được nhúng trực tiếp trong phần mềm: Ví dụ trong ArcGIS có tích hợp ArcPy (thay thế cho VBA từ phiên bản ArcGIS 10), QGIS cũng có tích hợp Python console. Ví dụ sau trả về số lượng của layer đang được chọn (active) trong QGIS:
                       layer = qgis.utils.iface.activeLayer()
                      layer.featureCount()


                    • Phát triển plugins gắn thêm vào các phần mềm GIS: Ví dụ, QGIS được phát triển bằng C++, tuy nhiên người dùng có thể xây dựng các plugin cho QGIS bằng Python thay vì C++, và hiện nay Python plugins chiếm phần lớn số lượng plugin và không ngừng phát triển trong cộng đồng người dùng QGIS.
                    • Phát triển ứng dụng GIS độc lập bằng cách cài đặt thêm các thư viện cần thiết để làm việc với dữ liệu không gian trong môi trường Python.
                    Hiện nay có rất nhiều thư viện hỗ trợ lập trình GIS bằng Python để xây dựng một ứng dụng GIS độc lập. Bài báo đề xuất một số thư viện cơ bản sau:

                    • Fiona - Python binding của OGR/GDAL: đọc, ghi dữ liệu vector/ raster ở nhiều định dạng khác nhau.
                    • Shapely - Python binding của Geos: thực hiện các phép toán trên dữ liệu không gian.
                    • PyProj - Python binding của PROJ.4: định nghĩa, quản lý và chuyển đổi giữa các datum và projection khác nhau cho dữ liệu không gian.
                    • NumPy - Numerical Python: thực hiện các tính toán khoa học.
                    • owslib - OGC Web Service utility library: thư viện tương tác với các dịch vụ dữ liệu không gian theo chuẩn OGC.
                    • Geodjango: Tạo ứng dụng Python WebGIS trên nền django framework.
                    • MapFish: Tạo ứng dụng Python WebGIS trên nền Pylons framework.
                    • GeoAlchamy : mở rộng SQLAlchemy (một Object Relational Mapper cho Python) làm việc với dữ liệu không gian, hỗ trợ PostGIS, Spatialite, MySQL, Oracle và MS SQL Server 2008.
                    Nhà phát triển Python có thể sử dụng các công cụ hỗ trợ sau:
                    • Sử dụng giao diện command line.
                    • Sử dụng IDE: một số IDE tiêu biểu như Komodo, PyScripter, Spyder, Crimson Editor, PyDev (trên nền eclipse), IDLE (IDLE được tích hợp sẵn khi cài đặt Python).
                    • Để thiết kế giao diện đồ họa cho Python có thể dùng PyQt .
                    Ngoài ra, có thể sử dụng một số nguồn dữ liệu miễn phí phục vụ cho mục đích học tập, nghiên cứu: Gdam, OpenStreetMap, Natural Earth, diva-gis, thematicmapping. (Lưu ý đây là chỉ là nguồn dữ liệu miễn phí và mang tính tham khảo, bài báo không bàn đến khía cạnh pháp lý của dữ liệu.)
                    Các tham khảo hữu ích cho các nhà phát triển ứng dụng GIS với Python:

                    • Python tutorial trên trang web của Python.
                    • Bài giảng Geoprocessing with Python using Open Source GIS.
                    • Sách Python Geospatial Development .

                    2.   XÂY DỰNG ỨNG DỤNG PYTHON WEBGIS VỚI GEODJANGO
                            Khi xây dựng ứng dụng, việc sử dụng các framework được xây dựng sẵn rất có ích để có thể tạo các ứng dụng một cách nhanh chóng, thuận tiện, chuẩn hóa và dễ bảo trì. Để lập trình web với Python, hiện nay có nhiều framework hỗ trợ như Django, Pylons, TurboGears, web2py, Zope2. Bài báo giới thiệu cách xây dựng một ứng dụng Python WebGIS đơn giản trên nền Django framework (theo mô hình Model - Template - View) với phần mở rộng Geodjango hỗ trợ dữ liệu không gian.

                      2.1.   Cài đặt các công cụ cần thiết

                      • Cài đặt Python (bài báo sử dụng Python 2.7). Sau khi cài đặt thành công, có thể khởi động Python ở chế độ cmd hoặc sử dụng IDLE để kiểm tra kết quả cài đặt.


                      • Cài đặt pip để thuận tiện khi cài đặt các package gắn thêm vào python được quản lý trên pypi (Python package Index). Cài đặt pip trong giao diện cmd:
                                 Đường dẫn đến pip> python setup.py install
                      • Sau khi cài đặt Python, có thể download Django và cài đặt tương tự như pip, hoặc có thể sử dụng câu lệnh đơn giản hơn để cài đặt django từ pyp
                               >pip install django
                      • Sau khi cài đặt django, có thể kiểm tra lại bằng cách:
                      >>> import django
                      >>> print(django.get_version())
                      1.5.2

                      2.2.   Tạo project Geodjango đầu tiên

                      • Tạo project với tên mydjango:
                      C:\Python27\Lib\site-packages\django\bin>django-admin.py startproject mydjango

                      • Cấu trúc của project mydjango:
                      mydjango/
                      manage.py
                      mysite/
                      __init__.py
                      settings.py
                      urls.py
                      wsgi.py

                      • Khởi động server:
                      C:\Python27\Lib\site-packages\django\bin\mydjango>manage.py runserver


                      • Kết quả trên trình duyệt:

                      2.3.   Xây dựng Geodjango WebGIS với PyDev
                               Trên thực tế, các công cụ giao diện đồ hoạ thường được sử dụng để đơn giản hoá các bước xây dựng ứng dụng. Bài báo trình bày các bước xây dựng một Geodjango WebGIS trên nền eclipse/PyDev, cụ thể là xây dựng một ứng dụng CRUD (Create- Read-Update-Delete) WebGIS cho đối tượng không gian là lớp dữ liệu world_borders shapefile. Qua đó phần nào thấy được hiện thực của mô hình Model – Template – View cũng như chức năng ORM (Object-Relational Mapping) của django framework.

                      • Cài đặt PostgreSQL/PostGIS, tạo GIS database với tên là geodjango (sử dụng template_postgis).
                      • Tải shapefile world_borders trên thematicmapping.
                      • Cài đặt psycopg2 để Python giao tiếp với CSDL PostgreSQL/PostGIS.
                      • Cài đặt eclipse và extension pydev. Vào Window/ Preferences, thiết lập Python interpreter cho eclipse (C:\Python27\python.exe).
                      • Tạo pyDev Django Project với tên là geodjango. Cấu hình Database là CSDL geodjango vừa tạo ở bước trên.

                      • Chỉnh sửa DATABASE ENGINE thành postgis trong geodjango/setting.py:
                      DATABASES = {
                      'default': {
                      'ENGINE''django.contrib.gis.db.backends.postgis',
                      'NAME''geodjango',
                      'USER''postgres',
                      'PASSWORD''postgres',
                      'HOST''localhost',
                      'PORT''5432',
                      }
                      }

                      • Tạo application với tên world:


                      • Trong geodjango/setting.py, thêm 'django.contrib.gis' và application 'world' vào INSTALL_APPS:
                      INSTALLED_APPS = (
                      'django.contrib.auth',
                      'django.contrib.contenttypes',
                      'django.contrib.sessions',
                      'django.contrib.sites',
                      'django.contrib.messages',
                      'django.contrib.staticfiles',
                      'django.contrib.admin',
                      'django.contrib.gis',
                      'world'
                      )


                      • Chỉnh sửa file world/models.py thành (Lưu ý model này được xây dựng dựa trên cấu trúc thuộc tính của world_borders shapefile):
                      from django.contrib.gis.db import models
                      class WorldBorder(models.Model):
                      # Regular Django fields corresponding to the attributes in the
                      # world borders shapefile.
                      name = models.CharField(max_length=50)
                      area = models.IntegerField()
                      pop2005 = models.IntegerField('Population 2005')
                      fips = models.CharField('FIPS Code', max_length=2)
                      iso2 = models.CharField('2 Digit ISO', max_length=2)
                      iso3 = models.CharField('3 Digit ISO', max_length=3)
                      un = models.IntegerField('United Nations Code')
                      region = models.IntegerField('Region Code')
                      subregion = models.IntegerField('SubRegion Code')
                      lon = models.FloatField()
                      lat = models.FloatField()
                      # GeoDjango‐specific: a geometry field (MultiPolygonField), and
                      # overriding the default manager with a GeoManager instance.
                      mpoly = models.MultiPolygonField()
                      objects = models.GeoManager()
                      # Returns the string representation of the model.
                      # On Python 3: def __str__(self):
                      def __unicode__(self):
                      return self.name


                      • Sau đó sử dụng chức năng django/syncDB để đồng bộ model và CSDL. Trong khi syncDB, điền các thông tin tạo superuser để login vào giao diện quản trị geodjango:

                      • Kết quả sau khi đồng bộ database trong PostGIS:


                      • Tiếp theo đổi tên table world_worldborder (table được tạo sau bước syncdb ở trên) thành world_worldborder_old, import world_borders shapefile vào database với tên là world_ worldborder, đặt tên cột geometry là mpoly. Sau khi import, rename cột gid thành id để đồng bộ với class WorldBorder được định nghĩa trong models.py ở bước trên.
                      • Tạo admin.py trong world với nội dung:
                      from django.contrib.gis import admin
                      from models import WorldBorder
                      admin.site.register(WorldBorder, admin.GeoModelAdmin)


                      • Chỉnh sửa file urls.py trong geodjango:
                      from django.conf.urls import patterns, url, include
                      from django.contrib.gis import admin
                      admin.autodiscover()
                      urlpatterns = patterns('',
                      url(r'^admin/', include(admin.site.urls)),)

                      • Run as/ pydev Django để khởi chạy ứng dụng, truy cập vào localhost:8000/admin để đăng nhập vào giao diện quản trị geodjango.
                      • Thử nghiệm: chọn add để tạo một đối tượng mới cho đối tượng world borders:


                      • Giao diện tạo mới một đối tượng world border hỗ trợ dữ liệu không gian thông qua Openlayers:
                       
                      3.   KẾT LUẬN
                            Bài báo đã trình bày cách tiếp cận lập trình GIS với Python, cũng như chi tiết cách xây dựng một ứng dụng CRUD WebGIS cơ bản trên nền Django framework với phần mở rộng cho dữ liệu không gian. Xây dựng ứng dụng GIS với Python là một trong những hướng lập trình rất thú vị và hữu ích vì Python hiện đang là một ngôn ngữ được lựa chọn trong rất nhiều ứng dụng nhờ tính tiện dụng, đơn giản và hiệu quả. Với geodjango, các nhà phát triển hoàn toàn có thể xây dựng ứng dụng WebGIS một cách nhanh chóng, đơn giản, tiện lợi và dễ bảo trì.


                      Tài liệu tham khảo

                      Alessandro Pasotti, P. C. (2010). Developing Geospatial software with Python.GFOSS Day. Foligno.
                      Creating custom spatial functions within the QGIS application framework using Python. Z-Pulley Inc.
                      django. (n.d.). Retrieved from https://www.djangoproject.com/
                      Dr. Marco Hugentobler, D. H. (2008). Extending the Functionality of QGIS with Python Plugins. Workshop FOSS4G.
                      Etherington, T. R. Python and geographic information system - current applications and future potential inlandscape ecology. The university of AucKland.
                      Ganeson, C. (2009). Spatializing your data with PostGIS, GeoDjango, and openlayers. Orelly's OSCON.
                      geodjango. (n.d.). Retrieved from http://geodjango.org/
                      Mishkovskyi, A. V. (2010). Python and GIS - Nobody expects Python in maps!
                      pydev. (n.d.). Retrieved from http://pydev.org/index.html
                      Westra, E. (2010). Python Geospatial development. Birmingham, B27 6PA, UK.: PACKT.

                      Friday, October 11, 2013

                      Friday, August 9, 2013

                      Xem hình ảnh trực tiếp trong eclipse bằng QuickImage

                      Hiện nay, eclipse IDE dường như là sự lựa chọn hàng đầu để xây dựng các ứng dụng nền Java, cũng như các ứng dụng Android (sử dụng Android Development Tool - cũng trên nền tảng eclipse). Đối với eclipse IDE, các image/icon sử dụng trong dự án không thể xem được trực tiếp trong IDE mà phải gọi trình xem ảnh có sẵn từ bên ngoài. Điều này gây bất tiện trong việc review image/icon sử dụng trong ứng dụng do phải di chuyển qua lại giữa eclipse và trình xem ảnh.

                      Vấn đề này có thể được khắc phục bằng plugin QuickImage ( truy cập http://psnet.nu/c/quickimage và cài đặt theo hướng dẫn)

                      Công cụ QuickImage cung cấp chức năng xem từng hình ảnh hoặc dạng thumbnails, phóng to/ thu nhỏ, xoay ảnh và di chuyển qua lại giữa các ảnh trong cùng thư mục.

                      Đây là hình ảnh minh hoạ về plugin QuickImage trong eclipse. Chúc các bạn có một trải nghiệm tiện ích thú vị với công cụ QuickImage.