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.
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
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
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.
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.
-
Blue Marble (độ phân giải 1-km/pixel).
-
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.
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