PDF:

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