JavaFXとGoogleMap(4)

 5/17、5/19にJXMapLayerを使い、JavaFXアプレット内でGoogleMapを表示していたが、最近、ブロックされるようになった。
 調べてみると、どうも、独自のAPIによるマップサーバーへの接続に該当するみたいで、利用規約上好ましくことがわかった。
 このため、マップサーバーをOpenStreetMapに変更し、以下のように修正した。(5/17,19の記述も修正)

 JavaFx内でGoogleMapを表示するのは、JWebPane待ちかなあ。

 →サンプル実行

ソースコード

package maptest;

import javafx.ext.swing.SwingComponent;
import javafx.scene.Group;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Transform;
import javafx.stage.AppletStageExtension;
import javafx.stage.Stage;
import maptest.Button;
import maptest.CloseButton;
import org.jdesktop.swingx.JXMapKit;
import org.jdesktop.swingx.JXMapViewer;
import org.jdesktop.swingx.mapviewer.DefaultTileFactory;
import org.jdesktop.swingx.mapviewer.GeoPosition;
import org.jdesktop.swingx.mapviewer.TileFactoryInfo;

var inBrowser = true;

public function run(args: String[]){
    var stageX = 0.0;
    var stageY = 0.0;
    var sWidth=480;
    var sHeight=320;
    var stage:Stage;
    var map=createMap() as JXMapViewer;
    map.setPreferredSize(new java.awt.Dimension(sWidth,sHeight));
    var component=SwingComponent.wrap(map);
    component.clip = Rectangle {
            width: sWidth height: sHeight
            arcHeight: 30 arcWidth: 30
    };

    var rect=Rectangle {
        x: 0
        y: 4
        width: bind sWidth+8
        height: 26
        arcHeight:5
        arcWidth:5
        fill:LinearGradient {
            startX:0.0
            startY:0.0
            endX:0.0
            endY:1.0
            proportional:true
            stops:[
                Stop{
                    offset: 0.0
                    color: Color.GRAY },
                Stop {
                    offset: 0.5
                    color: Color.BLACK },
                Stop {
                    offset: 1.0
                    color: Color.GRAY }
                ]
            }
        opacity:0.5
        onMouseDragged: function(e) {         
            stageX += e.dragX;
            stageY += e.dragY;
        }
    }

    var home=Button{
        translateX: 5
        translateY: bind rect.y+3;
        text: "Home"
        action: function() {
            map.setZoom(9);
            map.setAddressLocation(new GeoPosition(34.683,135.5));
        }
    }

    var grid=Button{
        translateX: bind home.translateX+70
        translateY: bind rect.y+3;
        text: "Grid"
        action: function() {
            if(map.isDrawTileBorders()){
               map.setDrawTileBorders(false);
            }else{
                map.setDrawTileBorders(true);
            }
        }
    }

    var close=CloseButton{
        visible: true
        translateX: sWidth - 20
        translateY: 12
        onMouseClicked: function(e) {
              stage.close();
        }
    }

    stage=Stage {
        title:"MapTest"
        x: bind stageX;
        y: bind stageY
        scene: Scene {
            fill:Color.NAVY
            content:VBox{
                content:[
                Group{
                    content:[
                        rect,
                        home,
                        grid,
                        close,
                    ]
                 }
                  VBox{
                transforms:Transform.translate(4,8);
                content:[
                    component,
                ]
                }
                ]
            }
         }
        extensions: [
            AppletStageExtension {
                shouldDragStart: function(e): Boolean {
                    if(home.hover or grid.hover or close.hover){
                        return false;
                    }else{
                       return inBrowser and e.primaryButtonDown and rect.hover;
                    }
            }

            onAppletRestored: function() {
                inBrowser = true;
            }
            useDefaultClose: false;
        }
        ]
    }
}

public function createMap(){
    var map=new JXMapViewer() as JXMapViewer;
    var max=17;
    var info=new OpenStreetTileInfo(1,17,17,256,true,true,
          "http://tile.openstreetmap.org", "x", "y", "zoom");
    var tf=new DefaultTileFactory(info);
    map.setTileFactory(tf);
    map.setZoom(9);
    map.setAddressLocation(new GeoPosition(34.6833,135.5));
    map.setDrawTileBorders(true);
    map.setRestrictOutsidePanning(true);
    map.setHorizontalWrapped(false);
    var kit=new JXMapKit();
    kit.setDefaultProvider(JXMapKit.DefaultProviders.OpenStreetMaps);
    kit.setDataProviderCreditShown(true);
    return map;
}

○ OpenStreetTileInfo.java

package maptest;

import org.jdesktop.swingx.mapviewer.TileFactoryInfo;

public class OpenStreetTileInfo extends TileFactoryInfo{
    final int max = 17;

    public OpenStreetTileInfo(int minimumZoomLevel, int maximumZoomLevel,
            int totalMapZoom, int tileSize, boolean xr2l,
            boolean yt2b, String baseURL, String xparam,
            String yparam, String zparam){
        super(minimumZoomLevel,maximumZoomLevel,totalMapZoom,
                tileSize,xr2l,yt2b,baseURL,xparam,yparam,zparam);
    }
    @Override
    public String getTileUrl(int x, int y, int zoom) {
        zoom = max-zoom;
        String url = this.baseURL +"/"+zoom+"/"+x+"/"+y+".png";
        return url;
    }
}