English | 日本語 | Español (Latinoamérica)
MapConductor React SDK の Google Maps プロバイダです。MapConductor のプロバイダ非依存なカメラ・マーカー・オーバーレイ API を通じて Google マップを描画するため、同じアプリケーションコードが MapLibre、Mapbox、Leaflet、OpenLayers、ArcGIS、Cesium、HERE でもそのまま動作します。
npm install @mapconductor/react-for-googlemaps@mapconductor/js-sdk-core と @mapconductor/js-sdk-react(マーカーなどの共有コンポーネントで使用)は依存関係として自動的にインストールされます。ただしアプリケーションコードはこの2つから直接 import するため、pnpm の strict(isolated)な node_modules を使う場合や、import するものをすべて明示的に宣言したい場合は、次のように明示的にインストールしてください:
npm install @mapconductor/react-for-googlemaps @mapconductor/js-sdk-core @mapconductor/js-sdk-reactMaps JavaScript API は @googlemaps/js-api-loader により実行時にロードされます。Google Cloud コンソールで取得した API キーだけ用意してください。
MapConductor + Google Maps で作る、いちばん簡単な地図アプリです。マーカーをクリックすると「Hello, MapConductor」の吹き出しが出ます。この地図は、次の 5 ステップで作れます。Google Maps は API キーが必要なので、自分の Google Maps API キーを用意すれば動きます。
Vite で React + TypeScript のプロジェクトを作成します。
npm create vite@latest hello-map -- --template react-ts
cd hello-map
npm install
npm run dev地図表示に必要なパッケージを入れます。ここでは Google Maps を使いますが、他の地図モジュールを使うこともできます。
npm install @mapconductor/react-for-googlemaps@mapconductor/react-for-googlemaps— Google Maps 用のコンポーネント/フック@mapconductor/js-sdk-react/@mapconductor/js-sdk-coreは依存関係として自動的にインストールされます。- Google Cloud コンソールで取得した API キーも必要です。環境変数
VITE_GOOGLE_MAPS_API_KEYに設定してください。
useGoogleMapViewState で地図の状態を作り、<GoogleMapView2D> で描画します。外側の要素に高さを与えると全画面になります。
import {
GoogleMapDesign,
GoogleMapView2D,
useGoogleMapViewState,
} from '@mapconductor/react-for-googlemaps';
import { createGeoPoint, createMapCameraPosition } from '@mapconductor/js-sdk-core';
const TOKYO = createGeoPoint({ latitude: 35.6812, longitude: 139.7671 });
const INITIAL_CAMERA = createMapCameraPosition({ position: TOKYO, zoom: 14 });
export default function App() {
const mapViewState = useGoogleMapViewState({
apiKey: import.meta.env.VITE_GOOGLE_MAPS_API_KEY,
mapDesignType: GoogleMapDesign.Normal,
cameraPosition: INITIAL_CAMERA,
});
return (
<div style={{ width: '100vw', height: '100vh' }}>
<GoogleMapView2D state={mapViewState} />
</div>
);
}フォトリアリスティックな 3D マップビューを使う場合は GoogleMapView2D の代わりに GoogleMapView を使用します。
createMarkerState でマーカーの状態を作り、<Marker> で登録します。オーバーレイは地図コンポーネントの子要素として書きます。
import { useMemo } from 'react';
import { createMarkerState } from '@mapconductor/js-sdk-core';
import { Marker } from '@mapconductor/js-sdk-react';
// ...App の中...
const marker = useMemo(
() => createMarkerState({ id: 'hello', position: TOKYO }),
[],
);
// ...return の中...
<GoogleMapView2D state={mapViewState}>
<Marker state={marker} />
</GoogleMapView2D>選択中かどうかを useState で持ち、マーカーの onClick で true にします。選択中のときだけ <InfoBubble> を描画します。これが完成形です。
import { useMemo, useState } from 'react';
import {
GoogleMapDesign,
GoogleMapView2D,
useGoogleMapViewState,
} from '@mapconductor/react-for-googlemaps';
import {
createGeoPoint,
createMapCameraPosition,
createMarkerState,
} from '@mapconductor/js-sdk-core';
import { InfoBubble, Marker } from '@mapconductor/js-sdk-react';
const TOKYO = createGeoPoint({ latitude: 35.6812, longitude: 139.7671 });
const INITIAL_CAMERA = createMapCameraPosition({ position: TOKYO, zoom: 14 });
export default function App() {
const mapViewState = useGoogleMapViewState({
apiKey: import.meta.env.VITE_GOOGLE_MAPS_API_KEY,
mapDesignType: GoogleMapDesign.Normal,
cameraPosition: INITIAL_CAMERA,
});
const [selected, setSelected] = useState(false);
const marker = useMemo(
() => createMarkerState({
id: 'hello',
position: TOKYO,
onClick: () => setSelected(true),
}),
[],
);
return (
<div style={{ width: '100vw', height: '100vh' }}>
<GoogleMapView2D state={mapViewState} onMapClick={() => setSelected(false)}>
<Marker state={marker} />
{selected && (
<InfoBubble marker={marker}>
<div style={{ padding: '8px 12px', fontWeight: 600 }}>
Hello, MapConductor
</div>
</InfoBubble>
)}
</GoogleMapView2D>
</div>
);
}- 座標・カメラ・マーカーは
js-sdk-coreの関数で作る(プロバイダー非依存) - 地図コンポーネントとフックは
react-for-googlemapsから来る(プロバイダー固有) - オーバーレイは地図コンポーネントの子要素として書く
- 表示・非表示は React の
useStateで制御する
@mapconductor/js-sdk-core— ジオメトリ・カメラ・状態のプリミティブ@mapconductor/js-sdk-react— 共有のMarker・Markers・シェイプ・インフォバブル
