WorldCam

Coding 2024년 12월 5일

3학년 2학기 야간수업(앱개발) JAVA World Wind Java SDK를 이용한 WorldCam


개발환경 : Eclipse(JAVA)


프로그램 배경 :

코로나로 여행을 떠나지 못했던 사람들이 다시금 여행을 떠나고 있습니다. 그러나 막상 가려하니 여러가지 이유가 발걸음을 느리게 합니다. 그 이유들 중에 여행을 갔을 때 날이 좋지 않거나 모습이 기대와 다르면, 비싼 돈 주고 가도 후회하는 여행객들이 빈번합니다. 저희는 그 점에서 영감을 얻어 여행 계획전에 자택에서도 편하고 간편하게, 미리 현지 모습을 볼 수 있다면 어떨까? 에서 시작했습니다. 그래서 NASA World Wind Java SDK를 활용해 보기로 하였고 JPanelJFrame을 응용하여 각국의 모습을 직관적으로 보기 쉽게 구현하였습니다.


활용방안 :

이 프로그램을 통해 평소에 꿈꾸던 여행지의 모습을 생생하게 실시간으로 확인할 수 있습니다.

시간이 부족하거나 경제적 여건 때문에 직접 떠나지 못하는 상황에서도, 이 프로그램만 있으면 언제든 집에서 편안하게 전 세계를 여행할 수 있습니다.

각 나라의 독특한 도시 경관들을 감상하며 마치 실제로 여행을 떠난 듯한 설렘을 느낄 수 있습니다. 또한, 여행지에서 직접 발걸음을 옮기지 않더라도,

다양한 지역의 현지 분위기를 체험하고 각종 관광 명소를 탐방할 수 있으며, 가고 싶은 장소를 목록에 추가해 다음 여행의 영감을 얻는 것도 가능합니다.

떠나기 전이나 여행 중에도 다음 목적지의 날씨를 실시간으로 확인할 수 있어, 계획을 미리 세워 여행의 만족도를 더욱 높일 수 있습니다.

여행을 준비하는 단계에서부터 이미 여행을 떠난 기분을 만끽하고, 목적지의 분위기와 날씨를 파악하면서 최적의 여행 일정을 짜보세요.

이 프로그램은 단순히 정보를 제공하는 것을 넘어, 여러분의 여행을 꿈꾸게 하고 그 꿈을 현실처럼 느끼게 해 줄 수 있는 강력한 도구입니다.

일상에서 벗어나 새로운 세계로의 문을 활짝 열어줄 이 프로그램과 함께, 지금 당장 모험을 떠나 보세요!!


프로그램 사진 :

프로그램 실행 화면
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");
}

태그