Nhúng SDK Java World Wind của NASA vào Eclipse Phát triển ứng dụng GIS với SDK nguồn mở này Vladimir Silva Kỹ sư phần mềm IBM 10 07 2009 Bộ SDK nguồn mở World Wind Java (WWJ) do NASA xây dựng thêm một loạt các khả năng mới cho cộng đồng hệ thông tin địa lý (GIS - Geographic Information Systems) mở. World Wind, một trình hiển thị thế giới tương tác 3 chiều, được viết bằng ngôn ngữ Java™ và OpenGL, cho phép người dùng có thể zoom từ một điểm ngoài không gian tới bất cứ vị trí nào trên Trái Đất. Bài viết này giải thích cách những người xây dựng GIS, muốn nâng cấp các ứng dụng trên nền Eclipse của mình, có thể nhúng SDK WWJ như một trình cắm thêm vào Eclipse như thế nào. SDK WWJ là mô hình địa cầu đồ họa 3 chiều được xây dựng bên trên nền các phần mở rộng Java OpenGL (JOGL). Lõi của hệ phân bậc các lớp của WWJ là lớp WorldWindowGLCanvas, đây là lớp con của lớp GLCanvas. Còn GLCanvas lại là một thành phần của bộ công cụ Window trừu tượng (AWT - Abstract Window Toolkit). Sự phụ thuộc của WWJ vào AWT là một trở ngại cho những người xây dựng ứng dụng GIS khi họ muốn sử dụng WWJ trong các ứng dụng Eclipse của mình. Như bạn có thể đã biết, Eclipse dùng bộ công cụ các tiểu phẩm tiêu chuẩn (SWT - Standard Widget Toolkit) vốn không tương thích với AWT. Hơn thế nữa, AWT và JOGL lại tích hợp chặt chẽ với nhau, điều này khiến cho cổng giao tiếp giữa giao diện AWT và SWT thêm khó khăn. Bài viết này trình bày một giải pháp giúp bạn có thể sử dụng SDK WWJ với các ứng dụng Eclipse. Các tập dữ liệu bó kèm theo WWJ WWJ bó kèm các tập dữ liệu có độ phân giải thấp, trung bình và cao sau đây (xem phần Tài nguyên để tìm liên kết đến chúng): • Blue Marble (độ phân giải 1-km/pixel) • i-cubed Landsat 7 (độ phân giải 15-meter/pixel) của Global Land Cover Facility thuộc Trường đại học MaryLand, Viện nghiên cứu Máy tính tiên tiến. • Dữ liệu độ cao (SRTM30Plus/SRTMv2/USGS NED derived dataset) của NASA Jet Propulsion Laboratory • USGS Topographic, của B&W Ortho, và Color Urban Area USGS và Microsoft® Research • Các địa danh ở U.S. lấy từ hệ thống thông tin tên địa lý USGS (Geographic Names Information System). © Copyright IBM Corporation 2009 Nhúng SDK Java World Wind của NASA vào Eclipse Nhẫn hiệu đăng ký Trang 1 của 8 developerWorks® Về cầu nối SWT/AWT ibm.com/developerWorks/vn/ • Các địa danh trên thế giới, lấy từ National Geospatial-Intelligence Agency SWT nhanh chóng trở thành bộ công cụ cửa sổ tầng đỉnh cho phép tạo nhanh các ứng dụng khách mạnh và mở rộng được. Cả SWT lẫn AWT/Swing đang cạnh tranh với nhau để giành ưu thế trong phát triển giao diện người dùng Java. Trên thực tế là cả hai đều có những ưu điểm và nhược điểm, Quỹ Eclipse đã nhận thấy sự cần thiết phải xây dựng một cầu nối SWT/AWT nhằm cho phép mọi người có thể nhúng các thành phần AWT/Swing vào SWT. Thành phần cầu nối này đã trở thành một bộ phận của SWT từ phiên bản Eclipse 3.0. API đơn giản này nằm trong gói org.eclipse.swt.awt (xem phần Tài nguyên). Cầu nối SWT/AWT là một thành phần then chốt mà ta sẽ cần để nhúng chương trình World Wind 3D Globe dựa trên nền AWT vào một ứng dụng Eclipse qua SWT. Khung nhìn Eclipse cho Earth 3D của WWJ Có sẵn cầu nối SWT/AWT trong SWT, việc gắn Earth 3D của WWJ vào khung nhìn rất nhanh. Sau đây là đoạn mã lệnh minh họa cho một khung nhìn Eclipse cơ bản thực thi nhiệm vụ này: Liệt kê 1. Khung nhìn Eclipse cơ sở cho Earth 3D của WWJ package org.eclipse.plugin.worldwind.views; _ /** * World Wind Eclipse RCP Earth View * @author Vladimir Silva * */ public class EarthView extends ViewPart { private static final Logger logger = Logger.getLogger(EarthView.class); public static final String ID = EarthView.class.getName(); final WorldWindowGLCanvas world = new WorldWindowGLCanvas(); /** * Initialize the default WW layers */ static { initWorldWindLayerModel(); } public EarthView() { } /** * This is a callback that will allow us to create the viewer and initialize * it. */ public void createPartControl(Composite parent) { // GUI: an SWT composite on top Composite top = new Composite(parent, SWT.EMBEDDED); top.setLayoutData(new GridData(GridData.FILL_BOTH)); // Swing Frame and Panel java.awt.Frame worldFrame = SWT_AWT.new_Frame(top); Nhúng SDK Java World Wind của NASA vào Eclipse Trang 2 của 8 ibm.com/developerWorks/vn/ developerWorks® java.awt.Panel panel = new java.awt.Panel(new java.awt.BorderLayout()); worldFrame.add(panel); // Add the WWJ 3D OpenGL Canvas to the Swing Panel panel.add(world, BorderLayout.CENTER); parent.setLayoutData(new GridData(GridData.FILL_BOTH)); } /* * Initialize WW model with default layers */ static void initWorldWindLayerModel () { Model m = (Model) WorldWind.createConfigurationComponent( AVKey.MODEL_CLASS_NAME); world.setModel(m); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { } public static void repaint() { world.repaint(); } @Override public void dispose() { super.dispose(); } } Đoạn mã lệnh 1 khởi đầu bằng việc tạo một thành phần đỉnh SWT, thành phần này sử dụng cầu nối để nhúng vải nền (canvas) WWJ swing OpenGL: Composite top = new Composite(parent, SWT.EMBEDDED); top.setLayoutData(new GridData(GridData.FILL_BOTH)); Tiếp đó, một khung con AWT sẽ được tạo ra trong thành phần đỉnh SWT này, sử dụng cầu nối, để chứa thành phần Swing panel, cần thiết cho vải nền WWJ OpenGL: java.awt.Frame worldFrame = SWT_AWT.new_Frame(top); java.awt.Panel panel = new java.awt.Panel(new java.awt.BorderLayout()); Cuối cùng, vải nền WWJ GL sẽ được thêm vào thành phần Swing panel: WorldWindowGLCanvas world = new WorldWindowGLCanvas(); panel.add(world, BorderLayout.CENTER); Hình 1 cho thấy hình Trái Đất được nhúng vào trong một khung nhìn Eclipse, như một phần của ứng dụng nền khách giàu (Rich Client Platform - RCP): Nhúng SDK Java World Wind của NASA vào Eclipse Trang 3 của 8 developerWorks® ibm.com/developerWorks/vn/ Hình 1. Earth WWJ dưới dạng một khung nhìn Eclipse WWJ so với Google Earth và Virtual Earth Google Earth và Virtual Earth là những địa cầu 3 chiều rất phổ biến có sẵn. Chúng đều là mô hình Trái Đất 3 chiều cho phép người dùng có thể zoom và xem các vị trí. Nhưng dù có các nét tương đồng với WWJ, những công cụ này theo những triết lý khác nhau về cơ bản. Google Earth và Virtual Earth là các sản phẩn thương mại, không phải là các SDK, vì thế những người phát triển ứng dụng không thể nâng cấp phía khách để thỏa mãn yêu cầu của họ. Ví dụ, các nhà khoa học không thể thêm hỗ trợ cho các khuôn dạng dữ liệu khoa học hoặc giao diện cho các dịch vụ bản đồ như dịch vụ bản đồ Web của OpenGIS (Web Map Services - WMS) hay dịch vụ các đặc tính web (Web Feature Services - WFS). Bản chất nguồn mở của WWJ cho phép bạn nhúng địa cầu vào bất kỳ một ứng dụng khách nào, như ta sẽ thấy trong bài viết này. Ta cũng có thể sửa WWJ để truy nhập bất cứ dạng dịch vụ dữ liệu nào. Đây là ưu thế hơn hản so với các đối tác thương mại. Bay tới một địa điểm trên địa cầu Nếu bạn muốn ứng dụng của mình lướt tới một vĩ độ/kinh độ xác định giống như Google Earth, cần phải có 3 đối tượng sau: • Một khung nhìn (View) cho phép chuyển tọa độ từ tọa độ mô hình sang tọa độ mắt nhìn, theo hệ tọa độ tay trái đã quy ước sẵn của OpenGL • Một địa cịu (Globe) biểu diễn một khối cầu Elipxoit 3 chiều chính là thế giới là mà bạn đang quan sát • Các tọa độ vĩ độ/kinh độ của nơi mà bạn muốn bay tới Nhúng SDK Java World Wind của NASA vào Eclipse Trang 4 của 8 ibm.com/developerWorks/vn/ developerWorks® Thông tin bổ sung bao gồm các góc đổi hướng (heading angle), góc xuống và độ cao so với mặt biển tính bằng mét. Đoạn mã lệnh 2 minh họa cách bay đến một vị trí: Liệt kê 2. Bay đến một tọa độ kinh/vĩ đã cho public void flyTo (LatLon latlon) { View view = world.getView(); Globe globe = world.getModel().getGlobe(); view.applyStateIterator(FlyToOrbitViewStateIterator.createPanToIterator( (OrbitView)view , globe , latlon // bbox , Angle.ZERO // Heading , Angle.ZERO // Pitch , 3e3 ) // Altitude/Zoom (m) ); } Phương thức applyStateIterator() của lớp View lia ống kính hoặc zoom ống kính lên địa cầu, sinh ra hiệu ứng lướt qua êm ái hay zoom tức thời vào các tọa độ đích trên địa cầu. WWJ cũng bó kèm các mô hình địa cầu khác ngoài mô hình Trái Đất; các mô hình 3 chiều có sẵn trong WWJ phiên bản 0.4.1 là: • Trái Đất (xem Tài nguyên cùng các tập dữ liệu kèm theo). • Mặt trăng: các tầng 40xx/30xx đa cấp xám/màu được tạo ra bằng cách tổ hợp một số dải phổ từ chuyến thăm dò Clementine. • Sao Hỏa: Bao gồm cả hình ảnh có độ phân giải cao thu được từ các chuyến thăm dò như Mars Orbital Camera (MOC), các bản đồ độ cao được xây dựng nhờ sử dụng dữ liệu của NASA Jet Propulsion Laboratory, và dữ liệu của NASA Mars Odyssey/THEMIS. Hình 2 cho thấy 3 mô hình Trái Đất, Mặt Trăng và Sao Hỏa trên 3 khung nhìn Eclipse riêng biệt: Nhúng SDK Java World Wind của NASA vào Eclipse Trang 5 của 8 developerWorks® ibm.com/developerWorks/vn/ Hình 2. Các khung nhìn của Trái Đất, Mặt Trăng, và Sao Hỏa trong một ứng dụng RCP Kết luận SDK World Wind Java là một trình hiển thị thế giới tương tác 3 chiều được viết bằng Java và OpenGL cho phép bất kỳ người dùng nào zoom từ ngoài không gian vào bất cứ vị trí nào trên Trái Đất. Bài viết này cung cấp một cơ sở cho việc nhúng SDK WWJ như một khung nhìn Eclipse để thu được các công cụ mới mạnh hơn cho việc phát triển hệ GIS trong Eclipse. Nhúng SDK Java World Wind của NASA vào Eclipse Trang 6 của 8 ibm.com/developerWorks/vn/ developerWorks® Tài nguyên Học tập • World Wind Central: Nền tảng kiến thức chính thức và trang web hỗ trợ dành cho World Wind SDK của NASA. • WWJ gói các bộ dữ liệu có độ phân giải thấp, trung và cao cấp này: • Blue Marble (độ phân giải 1-km/pixel). • i-cubed Landsat 7 (độ phân giải 15-meter/pixel) từ Global Land Cover Facility của Trường Đại học của Viện nghiên cứu Maryland với các nghiên cứu máy tính cao cấp. • Dữ liệu độ cao (bộ dữ liệu đo lường SRTM30Plus/SRTMv2/USGS NED) từ Dự án SRTM (SRTM Project) của Phòng thí nghiệm Jet Propulsion của NASA. • USGS Topographic, của B&W Ortho và Color Urban Area USGS và Microsoft® Researchcó sẵn từ TerraServer. • Các địa danh ở Mỹ từ USGS Geographic Names Information System. • World placenames từ National Geospatial-Intelligence Agency. • SWT/AWT bridge: Javadoc cho lớp SWT_AWT. • "Swing/SWT Integration" (Gordon Hirsch, eclipse.org, 2007): Bài viết này tập trung vào việc sử dụng cầu nối SWT/AWT hiện tại để nhúng các thành phần Swing vào trong một ứng dụng RCP dựa trên-SWT. • "Find your way around open source GIS" (Frank Pohlmann, developerWorks, 05.2005): Đọc về một số công cụ GIS cho những người sử dụng UNIX® và Linux®. • Eclipse project resources: Rất nhiều tài nguyên cho các nhà phát triển Eclipse. • Duyệt qua technology bookstore với các sách về các chủ đề kỹ thuật này hay khác. • developerWorks Java technology zone: Tìm hàng trăm bài viết về mọi khía cạnh của lập trình Java. Lấy sản phẩm và công nghệ • NASA World Wind SDK: Tải về World Wind Java SDK. • Europa Simultaneous Release project: Tải các gói phần mềm Châu Âu Eclipse miễn phí. Thảo luận • Xem developerWorks blogs và hãy dành tâm trí cho cộng đồng developerWorks. Nhúng SDK Java World Wind của NASA vào Eclipse Trang 7 của 8 developerWorks® ibm.com/developerWorks/vn/ Đôi nét về tác giả Vladimir Silva Vladimir Silva nguyên là một kiến trúc sư phần mềm của IBM, người phụ trách định hướng nghiên cứu Công nghệ IBM WebAhead, chẳng hạn như các dự án IBM Grid Toolbox. Một số công trình của Vladimir trong lĩnh vực bảo mật phía máy chủ đã được sáp nhật vào bộ Globus Toolkit. Vladimir cũng là tác giả của Tính toán lưới dành cho những người phát triển (Charles River Media, 2005). Các lĩnh vực nghiên cứu khác của Vladimir gồm có mạng nơ ron và trí tuệ nhân tạo. Vladimir sở hữu nhiều chứng chỉ IT © Copyright IBM Corporation 2009 (www.ibm.com/legal/copytrade.shtml) Nhẫn hiệu đăng ký (www.ibm.com/developerworks/vn/ibm/trademarks/) Nhúng SDK Java World Wind của NASA vào Eclipse Trang 8 của 8