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
Tóm tắt: 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).
Các địa danh trên thế giới, lấy từ National Geospatial-Intelligence Agency
Về cầu nối SWT/AWT
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);
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):
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
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:
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.
Mục lục
Về cầu nối SWT/AWT
Khung nhìn Eclipse cho Earth 3D của WWJ
Bay tới một địa điểm trên địa cầu
Kết luận