Как использовать Карты Google с элементом управления SAPUI5 GeoMap

У меня есть приложение SAPUI5, которому нужно отображать точки на элементе управления GeoMap. Он работает нормально, пока я использую HEREMaps в качестве провайдера. Однако компания хотела бы, чтобы я использовал Google Maps. Я не могу найти никакой информации о том, как настроить MapProvider для элемента управления GeoMap для использования Карт Google.

Вот (по сути) мой элемент управления GeoMap:

                <vk:content>
                    <vk:ContainerContent title="Map" icon="sap-icon://choropleth-chart">
                        <vk:content>
                            <vbm:GeoMap id="GeoMap" width="100%" height="100%">
                                <vbm:vos>
                                    <vbm:Spots 
                                        click="onClickItem" 
                                        contextMenu="onContextMenuItem" 
                                        id="caseTimeMapSpots" 
                                        items="{path: '/CaseEvents/results'}" 
                                        posChangeable="true" 
                                        scaleChangeable="true"
                                        >
                                        <vbm:items>
                                        <vbm:Spot 
                                            id="Spot"
                                            position="{Longitude};{Latitude};0" 
                                            tooltip="{EventName} - {path: 'EventDatetime', formatter: '.formatDate'} {path: 'EventDatetime', formatter: '.formatTime'}" 
                                            type="Warning"
                                            click="onClickSpot" 
                                            contextMenu="onContextMenuSpot" 
                                            text="{EventName}"
                                            scale="{path: 'DeleteInd', formatter: '.formatScale'}"
                                        />
                                        </vbm:items>
                                    </vbm:Spots>
                                </vbm:vos>
                            </vbm:GeoMap>
                        </vk:content>
                    </vk:ContainerContent>
                </vk:content>

И вот где я установил MapProvider в своем контроллере:

            var oGeoMap = this.getView().byId("GeoMap");
            var oMapConfig = {
                "MapProvider": [{
                    "name": "HEREMAPS",
                    "type": "",
                    "description": "",
                    "tileX": "256",
                    "tileY": "256",
                    "maxLOD": "20",
                    "copyright": "Tiles Courtesy of HERE Maps",
                    "Source": [
                        {
                        "id": "s1",
                        "url": "https://1.base.maps.cit.api.here.com/maptile/2.1/maptile/newest/normal.day/{LOD}/{X}/{Y}/256/png8?app_id=XXX"
                        },
                        {
                        "id": "s2",
                        "url": "https://2.base.maps.cit.api.here.com/maptile/2.1/maptile/newest/normal.day/{LOD}/{X}/{Y}/256/png8?app_id=XXX"
                        }
                    ]
                }],
                "MapLayerStacks": [{
                    "name": "DEFAULT",
                    "MapLayer": {
                        "name": "layer1",
                        "refMapProvider": "HEREMAPS",
                        "opacity": "1.0",
                        "colBkgnd": "RGB(255,255,255)"
                    }
                }]
            };
            oGeoMap.setMapConfiguration(oMapConfig);
            oGeoMap.setRefMapLayerStack("DEFAULT");
            oGeoMap.setInitialZoom(13);
            oGeoMap.setInitialPosition("-97.57;35.57;0");

Кто-нибудь делал это с помощью Google Maps? Как настроен MapProvider?

Спасибо.


person donkeyhotay    schedule 28.10.2016    source источник
comment
Это выполнимо.. это очень похоже на приведенное выше.. Вы можете иметь dom для холста карты и загружать карту после рендеринга в контроллере..   -  person Sunil B N    schedule 29.10.2016
comment
Спасибо за ответ. Да, кажется, все думают, что это выполнимо, но никто, кажется, не знает, что вставить в URL или в имя. Если вы знаете особенности, можете ли вы поделиться ими? Спасибо.   -  person donkeyhotay    schedule 31.10.2016
comment
jasper07.secondphase.com.au/openui5-googlemaps   -  person Sunil B N    schedule 01.11.2016
comment
Только что это заработало, я обновлю ответ, как только полностью разберусь с ним, и могу дать хорошую ссылку.   -  person Carsten    schedule 17.11.2016
comment
Спасибо, Карстен. Я с нетерпением жду новостей об этом.   -  person donkeyhotay    schedule 17.11.2016


Ответы (1)


Обновить

Так что я, наконец, в состоянии обернуть это. Существует официальный способ прямого доступа к плиткам карты Google с помощью API плиток. Следуя руководству по ссылке, вы можете настроить MapConfig, показанный ниже, с URL-адресом из Tiles API.

Но этот API недоступен без платного плана! (Этот план работает примерно в 10 раз дороже, чем использование JS API). Из-за этого я больше не буду заниматься этим.


Мне жаль, что я до сих пор не понял этого в той степени, в которой хотел бы. Следующая конфигурация является наиболее урезанной версией, которая делает свое дело. Дело в том, что вам нужен URL-адрес, чтобы напрямую получить плитки карты. С X и Y, указывающими плитки и {LOD} уровень детализации. Эти параметры не нужно заменять, они устанавливаются элементом управления GeoMap во время выполнения.

Основная причина, по которой я еще не опубликовал это, заключается в том, что, хотя это работает на техническом уровне, все, что я прочитал до сих пор, указывает на то, что прямой доступ к фрагментам противоречит Условиям использования Карт Google. Поэтому, пока он работает для возни, я бы не стал использовать его в производственной среде! В настоящее время я пытаюсь найти способ уточнить, есть ли что-то в лицензии, позволяющее это использовать, или я SOL.

К сожалению, официальный API не позволяет запрашивать определенные фрагменты карты. Другой способ выяснить это — посмотреть, может ли SAP предоставить другую реализацию MapProvider.

var oMapConfig = {
        "MapProvider": [{
            "name": "GMAP",
            "Source": [{
            "id": "s1",
            "url": "https://mt.google.com/vt/x={X}&y={Y}&z={LOD}"
            }]
        }],
        "MapLayerStacks": [{
                "name": "DEFAULT",
                "MapLayer": {
                        "name": "layer1",
                        "refMapProvider": "GMAP",
                        "opacity": "1",
                        "colBkgnd": "RGB(255,255,255)"
                }
        }]
    };
person Carsten    schedule 23.11.2016
comment
Ах. Спасибо за обновления. Да, если это против ToS, это будет сомнительно для производства. С тех пор я получил библиотеку googlemaps openui5 для работы в своем приложении, и я думаю, что на данный момент эта библиотека будет служить нашим целям. Я ценю, что вы поделились кодом. - person donkeyhotay; 30.11.2016
comment
Эй, только что немного доработал и обновил ответ, указав способ настройки карт Google таким образом, чтобы не нарушать ToS. Пожалуйста, также примите ответ, если он решает вопрос. - person Carsten; 05.12.2016
comment
Спасибо, Карстен. Я попробую, когда у меня будет шанс. Я ценю помощь! - person donkeyhotay; 06.12.2016
comment
Карстен, сегодня я попробовал использовать твой код, и он отлично сработал. Спасибо вам большое за обмен. Я отметил ваш ответ как ответ и хотел бы отправить вам бутылку виски ;-) - person donkeyhotay; 09.12.2016