java - Mapbox 和 GWT 集成

标签 java javascript gwt mapbox

我正在尝试使 MapBox Javascript 库与 GWT(Google Web Toolkit)一起使用。

下面是我正在使用的代码片段:

    HorizontalPanel horizontalPanel = new HorizontalPanel();
    horizontalPanel.setHeight("400px");
    horizontalPanel.setWidth("600px");
    horizontalPanel.getElement().setId("geo-map");

    ScriptInjector.fromUrl("https://api.tiles.mapbox.com/mapbox.js/v2.1.4/mapbox.js").setCallback(new Callback<Void, Exception>() {

        @Override
        public void onFailure(Exception reason) {

        }

        @Override
        public void onSuccess(Void result) {

            ScriptInjector.fromString("$wnd.$(document).ready(function() {" +
                            "console.log(\"Ok, it's me!\");" +
                            "L.mapbox.accessToken = \"Some Acess Token\";" +
                            "var map = L.mapbox.map(\"geo-map\", \"geo-map-id\").setView([40, -74.50], 9);" +
                            "console.log(\"Ok, it's me again!\");" +
                        "});").inject();

        }
    }).inject();

    // Add the nameField and sendButton to the RootPanel
    // Use RootPanel.get() to get the entire body element
    RootPanel.get("nameFieldContainer").add(horizontalPanel);

当我运行代码时,我收到以下异常:

[15:00:46.146] 错误:找不到 map 容器。 @https://api.tiles.mapbox.com/mapbox.js/v2.1.4/mapbox.js:1

提前致谢

更新:我终于让它工作了,我必须将 javascript 函数放在模块的 HTML 文件的 body 标记的末尾。

最佳答案

将 GWT 2.8 JsInterop 与 MapBox GL JS 结合使用如下:

  1. 按照 MapBox Tutorial 在索引页上添加 css 和 js
  2. 使 mapboxgl.Map 可用于您的 Java:

    @JsType(isNative = true, namespace = "mapboxgl")
    
     class Map {
    
        @JsOverlay
        private static long serial = 0L; 
    
        @JsConstructor
        protected Map(JavaScriptObject options) { }
    
        @JsOverlay
        public static Map build(AbsolutePanel panel) {
            return Map.build(panel, new JSONObject());
        }
    
        @JsOverlay
        public static Map build(AbsolutePanel panel, JSONObject mapOptions) {
    
            String id = "map" + serial++;
            mapOptions.put("container", new JSONString(id));
    
            panel.getElement().setId(id);
            Map result = new Map(mapOptions.getJavaScriptObject());     
            return result;
        }
    
    }
    
  3. 稍后您可以向 Map 类添加其他方法、属性、事件

  4. 使用参数 JSONObject mapOptions 设置 map 属性,例如:

    { 中心:[-122.420679, 37.772537],

    缩放:13,

    样式:'mapbox://styles/mapbox/dark-v9'}

  5. 创建一个扩展 AbsolutePanel 的类以成为您的 map 小组件

    public class MapPanel extends AbsolutePanel {
    
    private static boolean accessTokenIsSet = false; 
    
    Map map;
    JSONObject mapOptions;
    MapPanel instance;
    
    public MapPanel(int width, int height) {
        this(width, height, new MapOptions());
    }
    
    public MapPanel(int width, int height, JSONObject mapOptions) {     
        instance = this;
        this.mapOptions = mapOptions;
    
        if ( !accessTokenIsSet ) {
            setAccessToken();
            accessTokenIsSet = true;
        }
    
        getElement().getStyle().setWidth(width, Unit.PX);
        getElement().getStyle().setHeight(height, Unit.PX);
        this.addEvents();
    }
    
    private void addEvents() {
        addAttachHandler(new AttachEvent.Handler() {
    
            @Override
            public void onAttachOrDetach(AttachEvent event) {
                if ( event.isAttached() ) {
                    map = Map.build(instance, mapOptions);
                }
    
            }
        });
    }
    
    private static native void setAccessToken() /*-{
        mapboxgl.accessToken = '<your-key>';
    }-*/;
    

    }

  6. 实例化您的 MapPanel 小部件并在需要的地方添加

    JSONObject mapOptions = new JSONObject();
    
    JSONArray center = new JSONArray();
    center.set(0, new JSONNumber(-122.420679));
    center.set(1, new JSONNumber(37.772537));
    
    mapOptions.put("style", new JSONString("mapbox://styles/mapbox/streets-v9"));
    mapOptions.put("zoom", new JSONNumber(13));
    mapOptions.put("center", center);
    MapPanel mapPanel = new MapPanel(300, 300, mapOptions);
    RootPanel.get().add(mapPanel);
    

关于java - Mapbox 和 GWT 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614368/

相关文章:

javascript - 如何使用 Sequelize 创建嵌套对象和关系

java - GWT。排除共享域对象以分离 Maven 模块

java - 向 gwt 建议框添加更多按钮

java - 为什么 Locale.class.isAssignableFrom([locale type].getClass()) 返回 false?

java - hibernateTemplate如何进行保存操作?

java - Java 中的 SonarQube Web API 身份验证

java - OnPostExecute 被跳过

javascript - 提交后如何获得 React Native TextInput 以保持焦点?

javascript - Google 跟踪代码管理器自定义 Javascript : "Unknown variable {{Click Id}}"

java - GWT-GIN 与 Raw Guice