Closed9
ReactでGoogle Street Viewを表示したい
これっぽい感じで表示したい
自社サービス内で使っているライブラリ:
ストリートビューは、スタンドアロンの DOM 要素内で使用できますが、用途として最も便利なのは地図上で場所を特定したいときです。地図ではストリートビューはデフォルトで有効になっており、ズームや移動に使用するナビゲーション コントロールには、ストリートビューの「ペグマン コントロール」が統合されています。このコントロールを非表示にするには、地図の MapOptions で streetViewControl を false に設定します。ストリートビュー コントロールのデフォルトの位置を変更することもできます。その場合は、Map の streetViewControlOptions.position プロパティを新しい ControlPosition に設定します。
→ streetViewControl
というoptionでコントロールできるよう
interface MapOptions {
....
streetView?: any;
streetViewControl?: boolean | undefined;
streetViewControlOptions?: { position: number } | undefined;
...
}
typeにあったのでここから設定すればいいのかな
Street viewと通常ビューの切り替えボタンをオーバレイするサンプルがあった
- street view設定部分
let panorama: google.maps.StreetViewPanorama;
const astorPlace = { lat: 40.729884, lng: -73.990988 };
// We get the map's default panorama and set up some defaults.
// Note that we don't yet set it visible.
panorama = map.getStreetView()!; // TODO fix type
panorama.setPosition(astorPlace);
panorama.setPov(
/** @type {google.maps.StreetViewPov} */ {
heading: 265,
pitch: 0,
}
);
- 視点の調整
heading(デフォルトは 0)は、カメラ中心の回転角度を、真北からの相対角度で定義します。方向は、時計回り(90 度が東)で計測します。
pitch(デフォルトは 0)は、カメラの初期デフォルト ピッチからの「上」または「下」向きの角度を定義します。通常は水平です(常に水平とは限りません。たとえば、山で撮影された画像は、水平ではないデフォルトの初期ピッチで表示される場合があります)。ピッチ角度は、見上げる方向を正の値(デフォルトのピッチと直行する真上方向が +90 度)で、下を向く方向を負の値(デフォルトのピッチと直交する真下の方向が -90 度)として計測します。
別ライブラリもあるっぽいな
alpha phaseなのが懸念点だけど開発は積極的みたい
- こちらの方がstar数的に安全そう
方針
- google-map-react でstreet viewをデフォルトでやる方法を探す
- 難しそうであれば react-google-maps-api の方で考えてみる
google-map-react
いくつかstreet view関連のissue立ってたので見てみる
const GoogleMap = props => (
<GoogleMapReact
zoom={props.zoom}
center={props.center}
bootstrapURLKeys={{
key: YOUR_KEY,
language: 'en',
}}
onGoogleApiLoaded={({ map, maps }) => apiIsLoaded(map, maps)}
>
{props.children}
</GoogleMapReact>
);
const apiIsLoaded = (map, maps) => {
if (map) {
const panorama = maps.StreetViewPanorama(
this.refs.panorama, {
position: { lat: -34.397, lng: 150.644 },
pov: {
heading: 34,
pitch: 10,
},
});
map.setStreetView(panorama);
}
};
apiIsLoadedでpanoramaを設定すればどうやらできるらしい
const apiLoaded = (map: any, maps: any, pins: any = []) => {
if (map) {
console.log('setStreetView')
const astorPlace = { lat: 40.729884, lng: -73.990988 }
const panorama = map.getStreetView()! // TODO fix type
panorama.setPosition(astorPlace)
panorama.setPov(
/** @type {google.maps.StreetViewPov} */ {
heading: 265,
pitch: 0,
}
)
panorama.setVisible(true)
}
}
<GoogleMapReact
...
onGoogleApiLoaded={({ map, maps }) => apiLoaded(map, maps)}
....
>
{/* {Nearbys} */}
{Markers}
{MarkerGroups}
</GoogleMapReact>
で表示できた
このスクラップは2023/12/07にクローズされました