Как добавить объект Google Maps из кода GWT?

Я хотел бы использовать карты Google в своем приложении GWT. Дело в том, что API gwt-maps поддерживает только Google Maps API версии 2, а API обычных карт — версии 3. Итак, в основном я хочу использовать стандартную библиотеку карт js из моего кода GWT, но это не так. т работа:

public void onModuleLoad() {
        buildMap();
    }



    private final native void buildMap()/*-{



         <script type="text/javascript"
    src="http://maps.googleapis.com/maps/api/js?sensor=false">
    </script>
            var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

        }-*/;

Я подозреваю, что проблема в том, что onModuleLoad не эквивалентен body.onload. Что вы думаете?


person Alex1987    schedule 23.09.2011    source источник


Ответы (3)


Вы должны проверить gwt-google-maps-v3, открытый исходная оболочка для версии 3 API Карт. Технически проект устарел, потому что он объединяется с gwt-google-apis, но, по крайней мере, он направит вас на правильный путь.

person Chris Cashwell    schedule 23.09.2011

У меня есть целое приложение для этого. Ознакомьтесь с проектом на странице https://github.com/dartmanx/mapmaker/tree/0.5. 2

Вы можете обратить особое внимание на мой служебный класс для Google Maps:

https://github.com/dartmanx/mapmaker/blob/0.5.2/src/main/java/org/jason/mapmaker/client/util/GoogleMapUtil.java

Надеюсь, это поможет, я прошел через много боли с этим JSNI.

Джейсон

person Jason    schedule 23.09.2011
comment
Спасибо. Я обязательно проверю это. - person Alex1987; 24.09.2011

Хорошо, я нашел решение.

Первое, что я сделал, это создал UIBinder для хранения div карты:

<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">
    <div id="map_canvas" style="width:100%; height:100%"></div>
</ui:UiBinder> 

А вот и остальная часть кода:

public void onModuleLoad() {
    mapCanvas canvas = new mapCanvas();
    Document.get().getBody().appendChild(canvas.getElement());
    buildMap();
}   


private final native void buildMap()/*-{
    var latlng = new $wnd.google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: $wnd.google.maps.MapTypeId.ROADMAP
    };
    var map = new $wnd.google.maps.Map($doc.getElementById("map_canvas"), myOptions);
}-*/;
person Alex1987    schedule 23.09.2011
comment
... почему вы используете элемент ‹div›? Почему бы не использовать одну из множества доступных панелей, которые действуют подобно ‹div›, но обеспечивают собственный доступ? - person Chris Cashwell; 24.09.2011
comment
Ну, во-первых, я новичок в GWT, и я просто хотел создать простой пример JSNI для карт Google, который работает... Прямо сейчас я не знаю, как получить доступ к Panel из блока JSNI. - person Alex1987; 24.09.2011
comment
Хорошо, и почему вы хотите использовать JSNI, когда есть встроенные оболочки Maps API, которые облегчают вашу жизнь? Похоже, вы создаете код, который будет очень сложно поддерживать, когда у вас есть возможность этого не делать. Используйте оболочку, избавьте себя от необходимости вручную находить ошибки в коде, которые вы не можете пройти. Прочитайте мой ответ, размещенный ниже. - person Chris Cashwell; 24.09.2011
comment
Я бы с удовольствием использовал все, что облегчило бы мне жизнь :) Во-первых, я хотел использовать официальный gwt-maps api, но он поддерживает только v2 карт google. gwt-google-maps-v3 определенно хорош, но, к сожалению, он устарел, поэтому я бы проверил код там для своих реализаций, но я бы не хотел использовать код вслепую. Есть много разработчиков, которые вообще не используют GWT и используют только js для карт Google, и как только я лучше узнаю JSNI, ничего не изменится. - person Alex1987; 24.09.2011
comment
Он устарел, потому что он объединяется с gwt-google-apis. С кодом ничего не изменится. Устарел проект, а не код. - person Chris Cashwell; 24.09.2011
comment
На сайте google-maps-api-v3 четко указано, что некоторые функции недоступны. По-видимому, заявление о том, что это слияние с API, означает, что нам не нужно предоставлять полезную документацию. Мне пришлось просмотреть исходный каталог, чтобы даже увидеть, что там были классы для маркеров и InfoWindows. - person Jason; 28.09.2011