JavaFXでさわるGoogleMap

はじめに

この記事は JavaFX Advent Calendar 2016 - Qiita

の二十三日目の記事です。

記事を書くに当たったキッカケ

2016 JJUG-CCC でJavaFXで地図を表示するお話があり、

もっと手軽にさわれないかなーと思って調べてみました

今回触ったLibrary

GoogleMapv3 Javascript API をラップしてJavaFXで使えるようにしたLibraryです*1

http://rterp.github.io/GMapsFX/

gradleで使う場合は

compile 'com.lynden:GMapsFX:2.0.9'

の指定で利用可能です。

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: RobTerpilowski
Created-By: Apache Maven
Build-Jdk: 1.8.0_05
Main-Class: com.lynden.gmapsfx.MainApp

な 記述があるため

一応java8環境であれば、ダブルクリックで動作サンプルが見れます

一応もう一個サンプルは同梱されているようで

#MANIFEST.MFに指定されているサンプル
java -cp .:GMapsFX-2.0.9.jar com.lynden.gmapsfx.MainApp

java -cp .:GMapsFX-2.0.9.jar com.lynden.gmapsfx.MainApp2

あたりで動作は確認できます

試しにサンプルコード動かしてみたんですが

一応GoogleMapのコードを書いた事がある人であれば、似たような記述で書けるようです。

ただなんか解説記載が古いようでコンパイルエラーになったので ★ の箇所を修正

import com.lynden.gmapsfx.GoogleMapView;
import com.lynden.gmapsfx.MapComponentInitializedListener;
import com.lynden.gmapsfx.javascript.object.GoogleMap;
import com.lynden.gmapsfx.javascript.object.LatLong;
import com.lynden.gmapsfx.javascript.object.MapOptions;
import com.lynden.gmapsfx.javascript.object.MapTypeIdEnum;//★
import com.lynden.gmapsfx.javascript.object.Marker;
import com.lynden.gmapsfx.javascript.object.MarkerOptions;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class MainApp extends Application implements MapComponentInitializedListener {

GoogleMapView mapView;
GoogleMap map;

@Override
public void start(Stage stage) throws Exception {

    //Create the JavaFX component and set this as a listener so we know when 
    //the map has been initialized, at which point we can then begin manipulating it.
    mapView = new GoogleMapView();
    mapView.addMapInializedListener(this);

    Scene scene = new Scene(mapView);

    stage.setTitle("JavaFX and Google Maps");
    stage.setScene(scene);
    stage.show();
}


@Override
public void mapInitialized() {
    //Set the initial properties of the map.
    MapOptions mapOptions = new MapOptions();

    LatLong lat =  new LatLong(35.4748634, 139.6352027);

    mapOptions.center(lat)
            .mapType(MapTypeIdEnum.ROADMAP) //★
            .overviewMapControl(false)
            .panControl(false)
            .rotateControl(false)
            .scaleControl(false)
            .streetViewControl(false)
            .zoomControl(false)
            .zoom(12);

    map = mapView.createMap(mapOptions);

    //Add a marker to the map
    MarkerOptions markerOptions = new MarkerOptions();

    markerOptions.position(lat)
                .visible(Boolean.TRUE)
                .title("My Marker");

    Marker marker = new Marker( markerOptions );

    map.addMarker(marker);

}

public static void main(String[] args) {
    launch(args);
}
}

今更ながらコンパイル環境的な話

気軽に職場でお昼休憩とかに試そうと思ってたんですけど

せっかくAS環境が標準になってJava8が開発端末に普通に入れられるのはいいですが、

  • AS2.2あたりから
    • IDEA CE的な感じで JavaFX Pluginが導入できない
    • Groovy Consoleとかもどっか消えた><

コマンドラインコンパイルするという昔ながらの方法に・・

で、今更ながらローカルjarの参照がフルパス参照でしか認識しなくて何故かハマると。。

昔からそうだったかな・・・と

javac -cp $CLASSPATH:./GMapsFX-2.0.9.jar MainApp.java

コンパイルできていた認識が有るんですけど、なんでなんだろう??

もちろん環境パスは

export PATH=$PATH:.

で直下は参照できているんですけど・・

  • cmp.sh
javac -cp $CLASSPATH:`pwd`/GMapsFX-2.0.9.jar MainApp.java

# pause
# read Wait

java -cp .:GMapsFX-2.0.9.jar MainApp

という感じで、今回はタイムアウトです。。。

実際使うならGeoCodingとか現在地とかも出来るかも調べてみたいですね

あとで試したい記事

  • fxml を使ったサンプル

Mapping Directions with JavaFX using the GMapsFX Directions API | Rob's Blog

Mapping an Address with JavaFX using the GMapsFX Geocoding API | Rob's Blog

*1:キーとか指定するところがないんですがどこで指定してるんでしょう??