@capacitor/google-maps
在 Capacitor 中使用 Google 地图
安装
npm install @capacitor/google-maps
npx cap sync
API 密钥
要在任何平台上使用 Google Maps SDK,都需要获取与启用了结算功能的账户相关联的 API 密钥。这些密钥可以从 Google Cloud Console 获取。这对于所有三个平台(Android、iOS 和 Javascript)都是必需的。有关获取这些 API 密钥的更多信息,可以在每个平台的 Google Maps 文档 中找到。
iOS
Google Maps SDK 支持通过 enableCurrentLocation(bool) 显示用户的当前位置。要使用此功能,Apple 要求在 Info.plist 中指定隐私描述:
NSLocationWhenInUseUsageDescription(Privacy - Location When In Use Usage Description)
有关在 Xcode 中设置 iOS 权限的更多信息,请阅读 iOS 指南 中的 配置 Info.plist。
Typescript 配置
你的 项目还需要在 tsconfig.json 中将 skipLibCheck 设置为 true。
从旧版本迁移
目前主要的 Google Maps SDK 已支持在 Apple Silicon Mac 的模拟器上运行,但请确保你已安装最新版本的 Google-Maps-iOS-Utils。
如果你之前添加了获取未发布版本的工作区设置,现在可以通过从 ios/App/Podfile 中删除以下行来移除它:
pod 'Google-Maps-iOS-Utils', :git => 'https://github.com/googlemaps/google-maps-ios-utils.git', :commit => '637954e5bcb2a879c11a6f2cead153a6bad5339f'
然后从 ios/App/ 文件 夹运行 pod update Google-Maps-iOS-Utils 命令:
cd ios/App
pod update Google-Maps-iOS-Utils
Android
适用于 Android 的 Google Maps SDK 要求你将 API 密钥添加到项目中的 AndroidManifest.xml 文件。
<meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_API_KEY_HERE"/>
要使用某些位置功能,SDK 还要求将以下权限添加到你的 AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
变量
本插件将使用以下项目变量(定义在应用的 variables.gradle 文件中):
googleMapsPlayServicesVersion:com.google.android.gms:play-services-maps的版本(默认:19.2.0)googleMapsUtilsVersion:com.google.maps.android:android-maps-utils的版本(默认:3.19.1)googleMapsKtxVersion:com.google.maps.android:maps-ktx的版本(默认:5.2.1)googleMapsUtilsKtxVersion:com.google.maps.android:maps-utils-ktx的版本(默认:5.2.1)kotlinxCoroutinesVersion:org.jetbrains.kotlinx:kotlinx-coroutines-android和org.jetbrains.kotlinx:kotlinx-coroutines-core的版本(默认:1.10.2)androidxCoreKTXVersion:androidx.core:core-ktx的版本(默认:1.17.0)kotlin_version:org.jetbrains.kotlin:kotlin-stdlib的版本(默认:2.2.20)
使用
Google Maps Capacitor 插件附带了一个 Web 组件,必须在你的应用程序中使用该组件来渲染地图,因为它使我们能够在 iOS 上更有效地嵌入原生视图。插件将自动注册此 Web 组件供你在应用中使用。
对于 Angular 用户,你会收到一个警告错误,提示 Angular 编译器不认识这个 Web 组件。可以通过修改声明组件的模块来允许自定义 Web 组件来解决此问题。
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
@NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
在你的 HTML 中包含此组件,并为其分配一个 ID,以便稍后可以轻松查询该元素引用。
<capacitor-google-map id="map"></capacitor-google-map>
在 Android 上,地图渲染在整个 WebView 下方,并使用此组件在滚动事件期间管理其定位。这意味着作为开发者,你必须确保 WebView 从各层到底部完全透明。在典型的 Ionic 应用中,这意味着在 IonContent 和根 HTML 标签等元素上设置透明度,以确保可以看到地图。如果在 Android 上看不到地图,这应该是你首先检查的事项。
在 iOS 上,我们直接将地图渲染到 WebView 中,因此不需要相同的透明度效果。我们仍在研究 Android 的替代方法,并希望在未来的更新中更好地解决此问题。
Google 地图元素本身没有样式,因此你应该为其设置样式以适合页面的布局结构。 由于我们正在向此插槽渲染一个视图,元素本身没有宽度或高度,因此请务必显式设置这些值。
capacitor-google-map {
display: inline-block;
width: 275px;
height: 400px;
}
接下来,我们应该创建地图引用。这是通过从 Capacitor 插件导入 GoogleMap 类并调用 create 方法,并传入必需的参数来完成的。
import { GoogleMap } from '@capacitor/google-maps';
const apiKey = 'YOUR_API_KEY_HERE';
const mapRef = document.getElementById('map');
const newMap = await GoogleMap.create({
id: 'my-map', // 此地图实例的唯一标识符
element: mapRef, // 对 capacitor-google-map 元素的引用
apiKey: apiKey, // 你的 Google Maps API 密钥
config: {
center: {
// 地图渲染的初始位置
lat: 33.6,
lng: -117.9,
},
zoom: 8, // 地图渲染的初始缩放级别
},
});
至此,你的地图应该已在应用程序中创建。使用返回的地图引用,你可以通过多种方式轻松地与地图交互,这里展示了其中几种。
const newMap = await GoogleMap.create({...});
// 向地图添加标记
const markerId = await newMap.addMarker({
coordinate: {
lat: 33.6,
lng: -117.9
}
});
// 以编程方式移动地图
await newMap.setCamera({
coordinate: {
lat: 33.6,
lng: -117.9
}
});
// 启用标记聚合
await newMap.enableClustering();
// 处理标记点击事件
await newMap.setOnMarkerClickListener((event) => {...});
// 清理地图引用
await newMap.destroy();
完整示例### Angular
import { GoogleMap } from '@capacitor/google-maps';
@Component({
template: `
<capacitor-google-map #map></capacitor-google-map>
<button (click)="createMap()">创建地图</button>
`,
styles: [
`
capacitor-google-map {
display: inline-block;
width: 275px;
height: 400px;
}
`,
],
})
export class MyMap {
@ViewChild('map')
mapRef: ElementRef<HTMLElement>;
newMap: GoogleMap;
async createMap() {
this.newMap = await GoogleMap.create({
id: 'my-cool-map',
element: this.mapRef.nativeElement,
apiKey: environment.apiKey,
config: {
center: {
lat: 33.6,
lng: -117.9,
},
zoom: 8,
},
});
}
}
React
import { GoogleMap } from '@capacitor/google-maps';
import { useRef } from 'react';
const MyMap: React.FC = () => {
const mapRef = useRef<HTMLElement>();
let newMap: GoogleMap;
async function createMap() {
if (!mapRef.current) return;
newMap = await GoogleMap.create({
id: 'my-cool-map',
element: mapRef.current,
apiKey: process.env.REACT_APP_YOUR_API_KEY_HERE,
config: {
center: {
lat: 33.6,
lng: -117.9
},
zoom: 8
}
})
}
return (
<div className="component-wrapper">
<capacitor-google-map ref={mapRef} style={{
display: 'inline-block',
width: 275,
height: 400
}}></capacitor-google-map>
<button onClick={createMap}>创建地图</button>
</div>
)
}
export default MyMap;
你可能需要在 React 中为自定义元素创建一个 *.d.ts 文件:
// custom-elements.d.ts
declare module "react" {
namespace JSX {
interface IntrinsicElements {
"capacitor-google-map": React.DetailedHTMLProps<
React.HTMLAttributes<HTMLElement>,
HTMLElement
>;
}
}
}
export {};
Vue
<script lang="ts" setup>
import { ref, shallowRef, useTemplateRef } from 'vue'
import { GoogleMap } from '@capacitor/google-maps'
const mapRef = useTemplateRef<HTMLElement>('mapRef')
const newMap = shallowRef<GoogleMap>()
async function createMap() {
if (!mapRef.value) return
newMap.value = await GoogleMap.create({
id: 'my-cool-map',
element: mapRef.value,
apiKey: import.meta.env.VITE_YOUR_API_KEY_HERE,
config: {
center: {
lat: 33.6,
lng: -117.9,
},
zoom: 8,
},
})
}
</script>
<template>
<capacitor-google-map
ref="mapRef"
style="display: inline-block; width: 275px; height: 400px"
></capacitor-google-map>
<button @click="createMap()">创建地图</button>
</template>
请确保启用识别原生自定义元素功能,例如:
// vite.config.mts > plugins
Vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('capacitor-')
},
},
}),
JavaScript
<capacitor-google-map id="map"></capacitor-google-map>
<button onclick="createMap()">创建地图</button>
<style>
capacitor-google-map {
display: inline-block;
width: 275px;
height: 400px;
}
</style>
<script>
import { GoogleMap } from '@capacitor/google-maps';
const createMap = async () => {
const mapRef = document.getElementById('map');
const newMap = await GoogleMap.create({
id: 'my-map', // 此地图实例的唯一标识符
element: mapRef, // 对 capacitor-google-map 元素的引用
apiKey: 'YOUR_API_KEY_HERE', // 你的 Google Maps API 密钥
config: {
center: {
// 地图初始渲染位置
lat: 33.6,
lng: -117.9,
},
zoom: 8, // 地图初始缩放级别
},
});
};
</script>
API
create(...)enableTouch()disableTouch()enableClustering(...)disableClustering()addTileOverlay(...)removeTileOverlay(...)addMarker(...)addMarkers(...)removeMarker(...)removeMarkers(...)addPolygons(...)removePolygons(...)addCircles(...)removeCircles(...)addPolylines(...)removePolylines(...)destroy()setCamera(...)getMapType()setMapType(...)enableIndoorMaps(...)enableTrafficLayer(...)enableAccessibilityElements(...)enableCurrentLocation(...)setPadding(...)getMapBounds()fitBounds(...)setOnBoundsChangedListener(...)setOnCameraIdleListener(...)setOnCameraMoveStartedListener(...)setOnClusterClickListener(...)setOnClusterInfoWindowClickListener(...)setOnInfoWindowClickListener(...)setOnMapClickListener(...)setOnMarkerClickListener(...)setOnPolygonClickListener(...)setOnCircleClickListener(...)setOnPolylineClickListener(...)setOnMarkerDragStartListener(...)setOnMarkerDragListener(...)setOnMarkerDragEndListener(...)setOnMyLocationButtonClickListener(...)setOnMyLocationClickListener(...)- 接口
- 类型别名
- 枚举
create(...)
create(options: CreateMapArgs, callback?: MapListenerCallback<MapReadyCallbackData> | undefined) => Promise<GoogleMap>
| 参数 | 类型 |
|---|---|
options | |
callback | |
返回值: Promise<GoogleMap>