WorldCam
3학년 2학기 야간수업(앱개발) JAVA World Wind Java SDK를 이용한 WorldCam
개발환경 : Eclipse(JAVA)
프로그램 배경 :
코로나로 여행을 떠나지 못했던 사람들이 다시금 여행을 떠나고 있습니다. 그러나 막상 가려하니 여러가지 이유가 발걸음을 느리게 합니다. 그 이유들 중에 여행을 갔을 때 날이 좋지 않거나 모습이 기대와 다르면, 비싼 돈 주고 가도 후회하는 여행객들이 빈번합니다. 저희는 그 점에서 영감을 얻어 여행 계획전에 자택에서도 편하고 간편하게, 미리 현지 모습을 볼 수 있다면 어떨까? 에서 시작했습니다. 그래서 NASA World Wind Java SDK를 활용해 보기로 하였고 JPanel과 JFrame을 응용하여 각국의 모습을 직관적으로 보기 쉽게 구현하였습니다.
활용방안 :
이 프로그램을 통해 평소에 꿈꾸던 여행지의 모습을 생생하게 실시간으로 확인할 수 있습니다.
시간이 부족하거나 경제적 여건 때문에 직접 떠나지 못하는 상황에서도, 이 프로그램만 있으면 언제든 집에서 편안하게 전 세계를 여행할 수 있습니다.
각 나라의 독특한 도시 경관들을 감상하며 마치 실제로 여행을 떠난 듯한 설렘을 느낄 수 있습니다. 또한, 여행지에서 직접 발걸음을 옮기지 않더라도,
다양한 지역의 현지 분위기를 체험하고 각종 관광 명소를 탐방할 수 있으며, 가고 싶은 장소를 목록에 추가해 다음 여행의 영감을 얻는 것도 가능합니다.
떠나기 전이나 여행 중에도 다음 목적지의 날씨를 실시간으로 확인할 수 있어, 계획을 미리 세워 여행의 만족도를 더욱 높일 수 있습니다.
여행을 준비하는 단계에서부터 이미 여행을 떠난 기분을 만끽하고, 목적지의 분위기와 날씨를 파악하면서 최적의 여행 일정을 짜보세요.
이 프로그램은 단순히 정보를 제공하는 것을 넘어, 여러분의 여행을 꿈꾸게 하고 그 꿈을 현실처럼 느끼게 해 줄 수 있는 강력한 도구입니다.
일상에서 벗어나 새로운 세계로의 문을 활짝 열어줄 이 프로그램과 함께, 지금 당장 모험을 떠나 보세요!!
프로그램 사진 :



코드 :
package gov.nasa.worldwindx.examples;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.CompletableFuture;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import gov.nasa.worldwind.BasicModel;
import gov.nasa.worldwind.WorldWind;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
import gov.nasa.worldwind.event.SelectEvent;
import gov.nasa.worldwind.event.SelectListener;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.layers.RenderableLayer;
import gov.nasa.worldwind.pick.PickedObject;
import gov.nasa.worldwind.pick.PickedObjectList;
import gov.nasa.worldwind.render.Offset;
import gov.nasa.worldwind.render.PointPlacemark;
import gov.nasa.worldwind.render.PointPlacemarkAttributes;
import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;
public class CCTV extends ApplicationTemplate{
private WorldWindowGLCanvas map;
private EmbeddedMediaPlayerComponent previewPlayer;
private JPanel previewPanel;
private JLayeredPane layerPane;
private JFrame mainWindow;
private EmbeddedMediaPlayerComponent mainPlayer;
private String koreaUrl = "";
private String japanUrl = "";
private String italyUrl = "";
private String brazilUrl = "";
private String canadaUrl = "";
private String taiwanUrl = "";
private String franceUrl = "";
private String germanyUrl = "";
private String australiaUrl = "";
private String netherlandUrl = "";
private String philippinesUrl = "";
private String finlandUrl = "";
private String russiaUrl = "";
private String americaUrl = "";
private String icelandUrl = "";
private String swedenUrl = "";
private String norwayUrl = "";
private String portugalUrl = "";
private String spainUrl = "";
private String polandUrl = "";
private String ukyUrl = "";
private String indonesiaUrl = "";
private String kenyaUrl = "";
private String argentinaUrl = "";
private String saudiUrl = "";
private String nepalUrl = "";
private String switzerlandUrl = "";
private String englandUrl = "";
private String namibiaUrl = "";
private String mexicoUrl = "";
private String zimbabweUrl = "";
private String greenlandUrl = "";
private boolean HoverMarker = false;
public CCTV() {
setupUrlsParallel();
setupMap();
setupMain();
setupPreview();
}
private void setupUrlsParallel() {
CompletableFuture.runAsync(() -> koreaUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=-JhoMGoAfFc"));
CompletableFuture.runAsync(() -> japanUrl = getUrlFromYoutube("https://www.youtube.com/live/TUd7JORZeWo?si=OyM4bdIhIFykvo0Z"));
CompletableFuture.runAsync(() -> italyUrl = getUrlFromYoutube("https://www.youtube.com/live/HpZAez2oYsA?si=4ICL8sLjuY67Nbfx"));
CompletableFuture.runAsync(() -> brazilUrl = getUrlFromYoutube("https://www.youtube.com/live/bwQyNMjsG3k?si=nSeoIcSh5E_N6zug"));
CompletableFuture.runAsync(() -> canadaUrl = getUrlFromYoutube("https://www.youtube.com/live/MwcqP3ta6RI?si=fo5KZhAJ2FzjLbR5"));
CompletableFuture.runAsync(() -> taiwanUrl = getUrlFromYoutube("https://www.youtube.com/live/Fw9hgttWzIg?si=G7Get95lny9BrNtL"));
CompletableFuture.runAsync(() -> franceUrl = getUrlFromYoutube("https://www.youtube.com/live/cdTRCcj4DkU?si=Nua3swfhaUU50aik"));
CompletableFuture.runAsync(() -> germanyUrl = getUrlFromYoutube("https://www.youtube.com/live/Li3Dvqlo5uE?si=F5V4oSFtdfq2QCxM"));
CompletableFuture.runAsync(() -> australiaUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=jshwkG1ZpP8"));
CompletableFuture.runAsync(() -> netherlandUrl = getUrlFromYoutube("https://www.youtube.com/live/1phWWCgzXgM?si=fWQOqds9em_AdOaw"));
CompletableFuture.runAsync(() -> philippinesUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=DM_gUbwElKQ"));
CompletableFuture.runAsync(() -> finlandUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=LwihxyJ4V20"));
CompletableFuture.runAsync(() -> russiaUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=VhGdKCs5KIA"));
CompletableFuture.runAsync(() -> americaUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=41dve_9EfyI"));
CompletableFuture.runAsync(() -> icelandUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=ZONCgHc1cZc"));
CompletableFuture.runAsync(() -> swedenUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=NCfMPD5A6hQ"));
CompletableFuture.runAsync(() -> norwayUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=c4kpeZHcke8"));
CompletableFuture.runAsync(() -> portugalUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=8tn0XW7KLhM"));
CompletableFuture.runAsync(() -> spainUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=Tj6pejNBNlI"));
CompletableFuture.runAsync(() -> polandUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=wAxpRk9-6ZM"));
CompletableFuture.runAsync(() -> ukyUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=e2gC37ILQmk"));
CompletableFuture.runAsync(() -> indonesiaUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=Z38gx7Cd7H0"));
CompletableFuture.runAsync(() -> kenyaUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=qTWUtKXnp8g"));
CompletableFuture.runAsync(() -> argentinaUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=if91GyWP3zQ"));
CompletableFuture.runAsync(() -> saudiUrl = getUrlFromYoutube("https://www.youtube.com/watch?v=Kt7hKHlArl8"));
CompletableFuture.runAsync(() -> nepalUrl = getUrlFromYoutube("https://www.youtube.com/live/PVvIVCkmQDY?si=v7Dr1wHfHsqKJC1C"));
CompletableFuture.runAsync(() -> switzerlandUrl = getUrlFromYoutube("https://www.youtube.com/live/yDKJMdZTEXQ"));
CompletableFuture.runAsync(() -> englandUrl = getUrlFromYoutube("https://www.youtube.com/live/jMVYZ9uMkwI"));
CompletableFuture.runAsync(() -> namibiaUrl = getUrlFromYoutube("https://www.youtube.com/live/ydYDqZQpim8"));
CompletableFuture.runAsync(() -> mexicoUrl = getUrlFromYoutube("https://www.youtube.com/live/yr5PjSQoLUE"));
CompletableFuture.runAsync(() -> zimbabweUrl = getUrlFromYoutube("https://www.youtube.com/live/QYIZd8cN2IM"));
CompletableFuture.runAsync(() -> greenlandUrl = getUrlFromYoutube("https://www.youtube.com/live/JQ0qoLU21Fo"));
}
private String getUrlFromYoutube(String youtubeUrl) {
String m3u8Url = "";
try {
ProcessBuilder builder = new ProcessBuilder("C:\\WWJ\\yt-dlp.exe", "-g", youtubeUrl);
Process process = builder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
m3u8Url = reader.readLine();
System.out.println("Retrieved URL: " + m3u8Url);
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return m3u8Url;
}
private void setupMap() {
map = new WorldWindowGLCanvas();
map.setModel(new BasicModel());
map.setPreferredSize(new Dimension(800, 850));
JFrame frame = new JFrame("WorldCam");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
layerPane = new JLayeredPane();
layerPane.setPreferredSize(new Dimension(800, 850));
layerPane.setLayout(null);
map.setBounds(0, 0, 800, 850);
layerPane.add(map, JLayeredPane.DEFAULT_LAYER);
frame.add(layerPane, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
map.addSelectListener(new SelectListener() {
@Override
public void selected(SelectEvent event) {
if (event.getEventAction().equals(SelectEvent.ROLLOVER)) {
PickedObjectList objects = map.getObjectsAtCurrentPosition();
if (objects != null && objects.getTopPickedObject() != null) {
PickedObject obj = objects.getTopPickedObject();
if (obj.getObject() instanceof PointPlacemark) {
PointPlacemark mark = (PointPlacemark) obj.getObject();
switch (mark.getLabelText()) {
case "KOREA":
if (!HoverMarker) {
playPreview(koreaUrl);
HoverMarker = true;
}
break;
case "JAPAN":
if (!HoverMarker) {
playPreview(japanUrl);
HoverMarker = true;
}
break;
case "ITALY":
if (!HoverMarker) {
playPreview(italyUrl);
HoverMarker = true;
}
break;
case "BRAZIL":
if (!HoverMarker) {
playPreview(brazilUrl);
HoverMarker = true;
}
break;
case "CANADA":
if (!HoverMarker) {
playPreview(canadaUrl);
HoverMarker = true;
}
break;
case "TAIWAN":
if (!HoverMarker) {
playPreview(taiwanUrl);
HoverMarker = true;
}
break;
case "FRANCE":
if (!HoverMarker) {
playPreview(franceUrl);
HoverMarker = true;
}
break;
case "GERMANY":
if (!HoverMarker) {
playPreview(germanyUrl);
HoverMarker = true;
}
break;
case "AUSTRALIA":
if (!HoverMarker) {
playPreview(australiaUrl);
HoverMarker = true;
}
break;
case "NETHERLAND":
if (!HoverMarker) {
playPreview(netherlandUrl);
HoverMarker = true;
}
break;
case "PHILIPPINES":
if (!HoverMarker) {
playPreview(philippinesUrl);
HoverMarker = true;
}
break;
case "FINLAND":
if (!HoverMarker) {
playPreview(finlandUrl);
HoverMarker = true;
}
break;
case "RUSSIA":
if (!HoverMarker) {
playPreview(russiaUrl);
HoverMarker = true;
}
break;
case "AMERICA":
if (!HoverMarker) {
playPreview(americaUrl);
HoverMarker = true;
}
break;
case "ICELAND":
if (!HoverMarker) {
playPreview(icelandUrl);
HoverMarker = true;
}
break;
case "SWEDEN":
if (!HoverMarker) {
playPreview(swedenUrl);
HoverMarker = true;
}
break;
case "NORWAY":
if (!HoverMarker) {
playPreview(norwayUrl);
HoverMarker = true;
}
break;
case "PORTUGAL":
if (!HoverMarker) {
playPreview(portugalUrl);
HoverMarker = true;
}
break;
case "SPAIN":
if (!HoverMarker) {
playPreview(spainUrl);
HoverMarker = true;
}
break;
case "POLAND":
if (!HoverMarker) {
playPreview(polandUrl);
HoverMarker = true;
}
break;
case "UKRAINE":
if (!HoverMarker) {
playPreview(ukyUrl);
HoverMarker = true;
}
break;
case "INDONESIA":
if (!HoverMarker) {
playPreview(indonesiaUrl);
HoverMarker = true;
}
break;
case "KENYA":
if (!HoverMarker) {
playPreview(kenyaUrl);
HoverMarker = true;
}
break;
case "ARGENTINA":
if (!HoverMarker) {
playPreview(argentinaUrl);
HoverMarker = true;
}
break;
case "SAUDI":
if (!HoverMarker) {
playPreview(saudiUrl);
HoverMarker = true;
}
case "NEPAL":
if (!HoverMarker) {
playPreview(nepalUrl);
HoverMarker = true;
}
case "SWITZERLAND":
if (!HoverMarker) {
playPreview(switzerlandUrl);
HoverMarker = true;
}
case "ENGLAND":
if (!HoverMarker) {
playPreview(englandUrl);
HoverMarker = true;
}
case "NAMIBIA":
if (!HoverMarker) {
playPreview(namibiaUrl);
HoverMarker = true;
}
case "MEXICO":
if (!HoverMarker) {
playPreview(mexicoUrl);
HoverMarker = true;
}
case "ZIMBABWE":
if (!HoverMarker) {
playPreview(zimbabweUrl);
HoverMarker = true;
}
case "GREENLAND":
if (!HoverMarker) {
playPreview(greenlandUrl);
HoverMarker = true;
}
break;
default:
if (HoverMarker) {
stopPreview();
HoverMarker = false;
}
break;
}
} else if (HoverMarker) {
stopPreview();
HoverMarker = false;
}
} else if (HoverMarker) {
stopPreview();
HoverMarker = false;
}
} else if (event.getEventAction().equals(SelectEvent.LEFT_DOUBLE_CLICK)) {
PickedObjectList objects = map.getObjectsAtCurrentPosition();
if (objects != null && objects.getTopPickedObject() != null) {
PickedObject obj = objects.getTopPickedObject();
if (obj.getObject() instanceof PointPlacemark) {
PointPlacemark mark = (PointPlacemark) obj.getObject();
switch (mark.getLabelText()) {
case "KOREA":
playMain(koreaUrl);
break;
case "JAPAN":
playMain(japanUrl);
break;
case "ITALY":
playMain(italyUrl);
break;
case "BRAZIL":
playMain(brazilUrl);
break;
case "CANADA":
playMain(canadaUrl);
break;
case "TAIWAN":
playMain(taiwanUrl);
break;
case "FRANCE":
playMain(franceUrl);
break;
case "GERMANY":
playMain(germanyUrl);
break;
case "AUSTRALIA":
playMain(australiaUrl);
break;
case "NETHERLAND":
playMain(netherlandUrl);
break;
case "PHILIPPINES":
playMain(philippinesUrl);
break;
case "FINLAND":
playMain(finlandUrl);
break;
case "RUSSIA":
playMain(russiaUrl);
break;
case "AMERICA":
playMain(americaUrl);
break;
case "ICELAND":
playMain(icelandUrl);
break;
case "SWEDEN":
playMain(swedenUrl);
break;
case "NORWAY":
playMain(norwayUrl);
break;
case "PORTUGAL":
playMain(portugalUrl);
break;
case "SPAIN":
playMain(spainUrl);
break;
case "POLAND":
playMain(polandUrl);
break;
case "UKRAINE":
playMain(ukyUrl);
break;
case "INDONESIA":
playMain(indonesiaUrl);
break;
case "KENYA":
playMain(kenyaUrl);
break;
case "ARGENTINA":
playMain(argentinaUrl);
break;
case "SAUDI":
playMain(saudiUrl);
break;
case "NEPAL":
playMain(nepalUrl);
break;
case "SWITZERLAND":
playMain(switzerlandUrl);
break;
case "ENGLAND":
playMain(englandUrl);
break;
case "NAMIBIA":
playMain(namibiaUrl);
break;
case "MEXICO":
playMain(mexicoUrl);
break;
case "ZIMBABWE":
playMain(zimbabweUrl);
break;
case "GREENLAND":
playMain(greenlandUrl);
break;
}
}
}
}
}
});
}
private void setupMain() {
mainWindow = new JFrame("JFrame CCTV Viewer");
mainWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
mainPlayer = new EmbeddedMediaPlayerComponent();
mainWindow.setLayout(new BorderLayout());
mainWindow.add(mainPlayer, BorderLayout.CENTER);
mainWindow.setSize(800, 600);
mainWindow.setVisible(true);
}
private void setupPreview() {
previewPlayer = new EmbeddedMediaPlayerComponent();
previewPanel = new JPanel(new BorderLayout());
previewPanel.add(previewPlayer, BorderLayout.CENTER);
previewPanel.setPreferredSize(new Dimension(200, 150));
previewPanel.setBackground(Color.BLACK);
previewPanel.setBounds(10, map.getHeight() - 160, 200, 150);
layerPane.add(previewPanel, JLayeredPane.PALETTE_LAYER);
previewPanel.setVisible(true);
}
private void playPreview(String url) {
if (!previewPlayer.mediaPlayer().status().isPlaying()) {
previewPlayer.mediaPlayer().media().play(url);
}
}
private void stopPreview() {
if (previewPlayer.mediaPlayer().status().isPlaying()) {
previewPlayer.mediaPlayer().controls().stop();
}
}
private void playMain(String url) {
mainPlayer.mediaPlayer().media().play(url);
}
public void addMarker(Position pos, String label, String imgPath) {
RenderableLayer layer = new RenderableLayer();
PointPlacemark marker = new PointPlacemark(pos);
marker.setLabelText(label);
marker.setValue(AVKey.DISPLAY_NAME, label);
marker.setLineEnabled(false);
marker.setAltitudeMode(WorldWind.CLAMP_TO_GROUND);
marker.setEnableLabelPicking(true);
PointPlacemarkAttributes attr = new PointPlacemarkAttributes();
attr.setImageAddress(imgPath);
attr.setImageColor(new Color(1f, 1f, 1f, 0.6f));
attr.setScale(0.1);
attr.setLabelOffset(new Offset(0.9d, 0.6d, AVKey.FRACTION, AVKey.FRACTION));
marker.setAttributes(attr);
layer.addRenderable(marker);
map.getModel().getLayers().add(layer);
}
public static void main(String[] args) {
CCTV viewer = new CCTV();
viewer.addMarker(Position.fromDegrees(37.5665, 126.978), "KOREA", "C:\\WWJ\\IMAGE\\korea.png");
viewer.addMarker(Position.fromDegrees(35.682839, 139.759455), "JAPAN", "C:\\WWJ\\IMAGE\\japan.png");
viewer.addMarker(Position.fromDegrees(43, 12), "ITALY", "C:\\WWJ\\IMAGE\\italy.png");
viewer.addMarker(Position.fromDegrees(-15, -47), "BRAZIL", "C:\\WWJ\\IMAGE\\brazil.png");
viewer.addMarker(Position.fromDegrees(50, -112), "CANADA", "C:\\WWJ\\IMAGE\\canada.png");
viewer.addMarker(Position.fromDegrees(24, 120), "TAIWAN", "C:\\WWJ\\IMAGE\\taiwan.png");
viewer.addMarker(Position.fromDegrees(47, 0), "FRANCE", "C:\\WWJ\\IMAGE\\france.png");
viewer.addMarker(Position.fromDegrees(52, 8), "GERMANY", "C:\\WWJ\\IMAGE\\german.png");
viewer.addMarker(Position.fromDegrees(-33, 151), "AUSTRALIA", "C:\\WWJ\\IMAGE\\australia.png");
viewer.addMarker(Position.fromDegrees(53, 5), "NETHERLAND", "C:\\WWJ\\IMAGE\\netherlands.png");
viewer.addMarker(Position.fromDegrees(13, 122), "PHILIPPINES", "C:\\WWJ\\IMAGE\\philippines.png");
viewer.addMarker(Position.fromDegrees(62, 25), "FINLAND", "C:\\WWJ\\IMAGE\\finland.png");
viewer.addMarker(Position.fromDegrees(55, 37), "RUSSIA", "C:\\WWJ\\IMAGE\\russia.png");
viewer.addMarker(Position.fromDegrees(38, -77), "AMERICA", "C:\\WWJ\\IMAGE\\america.png");
viewer.addMarker(Position.fromDegrees(65, -18), "ICELAND", "C:\\WWJ\\IMAGE\\iceland.png");
viewer.addMarker(Position.fromDegrees(60, 17), "SWEDEN", "C:\\WWJ\\IMAGE\\sweden.png");
viewer.addMarker(Position.fromDegrees(60, 7), "NORWAY", "C:\\WWJ\\IMAGE\\norway.png");
viewer.addMarker(Position.fromDegrees(39, -9), "PORTUGAL", "C:\\WWJ\\IMAGE\\portugal.png");
viewer.addMarker(Position.fromDegrees(40, -4), "SPAIN", "C:\\WWJ\\IMAGE\\spain.png");
viewer.addMarker(Position.fromDegrees(54, 18), "POLAND", "C:\\WWJ\\IMAGE\\poland.png");
viewer.addMarker(Position.fromDegrees(48, 33), "UKRAINE", "C:\\WWJ\\IMAGE\\ukraine.png");
viewer.addMarker(Position.fromDegrees(0, 115), "INDONESIA", "C:\\WWJ\\IMAGE\\indonesia.png");
viewer.addMarker(Position.fromDegrees(0, 37), "KENYA", "C:\\WWJ\\IMAGE\\kenya.png");
viewer.addMarker(Position.fromDegrees(-40, -69), "ARGENTINA", "C:\\WWJ\\IMAGE\\argentina.png");
viewer.addMarker(Position.fromDegrees(22, 43), "SAUDI", "C:\\WWJ\\IMAGE\\saudi-arabia.png");
viewer.addMarker(Position.fromDegrees(28, 84), "NEPAL", "C:\\WWJ\\IMAGE\\nepal.png");
viewer.addMarker(Position.fromDegrees(46, 8), "SWITZERLAND", "C:\\WWJ\\IMAGE\\switzerland.png");
viewer.addMarker(Position.fromDegrees(52, -1), "ENGLAND", "C:\\WWJ\\IMAGE\\england.png");
viewer.addMarker(Position.fromDegrees(22, 18), "NAMIBIA", "C:\\WWJ\\IMAGE\\namibia.png");
viewer.addMarker(Position.fromDegrees(23, -102), "MEXICO", "C:\\WWJ\\IMAGE\\mexico.png");
viewer.addMarker(Position.fromDegrees(20, 29), "ZIMBABWE", "C:\\WWJ\\IMAGE\\zimbabwe.png");
viewer.addMarker(Position.fromDegrees(64, -51), "GREENLAND", "C:\\WWJ\\IMAGE\\greenland.png");
}