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; } }