Closed9

ReactでGoogle Street Viewを表示したい

あてぃあてぃ

https://developers.google.com/maps/documentation/javascript/streetview?hl=ja#StreetViewMapUsage

ストリートビューは、スタンドアロンの DOM 要素内で使用できますが、用途として最も便利なのは地図上で場所を特定したいときです。地図ではストリートビューはデフォルトで有効になっており、ズームや移動に使用するナビゲーション コントロールには、ストリートビューの「ペグマン コントロール」が統合されています。このコントロールを非表示にするには、地図の MapOptions で streetViewControl を false に設定します。ストリートビュー コントロールのデフォルトの位置を変更することもできます。その場合は、Map の streetViewControlOptions.position プロパティを新しい ControlPosition に設定します。

streetViewControl というoptionでコントロールできるよう

interface MapOptions {
       ....
        streetView?: any;
        streetViewControl?: boolean | undefined;
        streetViewControlOptions?: { position: number } | undefined;
...
}

typeにあったのでここから設定すればいいのかな

あてぃあてぃ

Street viewと通常ビューの切り替えボタンをオーバレイするサンプルがあった
https://developers.google.com/maps/documentation/javascript/examples/streetview-overlays

  • 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 度)として計測します。

https://developers.google.com/maps/documentation/javascript/streetview?hl=ja#maps_streetview_simple-html:~:text=heading(デフォルトは 0,として計測します。

あてぃあてぃ

https://github.com/google-map-react/google-map-react/issues/251#issuecomment-355813361

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にクローズされました