React-Leafletで、地図の四隅に独自のコントロールを置く方法です。
ボタンを追加するサンプル
簡単にボタンを地図の右上に表示するサンプルコードである。
まず、ボタンを表示するカスタムコントロールを作る。
function MyControl() {
  const onClick = (e) => {
    console.log("click")
  }
  return (
    <div className="leaflet-top leaflet-right">
      <div className="leaflet-control leaflet-bar">
        <button onClick={onClick}>ボタン</button>
      </div>
    </div>
  )
}
export default MyControl
使い方は普通の Reactコンポーネントと同じで、<MapContainer> 内にカスタムコントロールを配置するだけである。
function App() {
  const [position, setPosition] = useState<LatLngTuple>([35.710304502694505, 139.81029660578832])
  return (
    <MapContainer center={position} zoom={17} scrollWheelZoom={false} style={{ height: "100vh" }}>
      <TileLayer
        attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
      />
      <MyControl/>
    </MapContainer>
  )
}
■ 実行結果
コントロールの表示位置
地図上でのカスタムコントロールの表示位置は、次の className で制御できる。
| 配置位置 | className | 
|---|---|
| 左上 | leaflet-top leaflet-left | 
| 右上 | leaflet-top leaflet-right | 
| 右下 | leaflet-bottom leaflet-right | 
| 左下 | leaflet-bottom leaflet-left | 
現在地を表示するボタンを追加する
現在地を地図上に表示するサンプルコードを作ってみよう。
まず、ボタンを押したら現在地を表示するコントロールを実装する。
現在値の取得は、JavaScirpt標準の navigator.geolocation.getCurrentPosition で取得できる。
位置情報の取得に成功した場合は、map.setView を使い現在地の緯度経度を地図上の中心に表示する。また、ユーザーが現在地の取得を拒否した場合はエラーが発生するので、エラー処理も実装すること。
function CurrentPosition() {
  
  const map = useMap()
  //現在地を取得
  const onClick = (e) => {
    navigator.geolocation.getCurrentPosition(
      position => {
        map.setView([position.coords.latitude, position.coords.longitude])
      },
      () => {
        alert("現在地の取得に失敗しました")
      })
  }
  return (
    <div className="leaflet-top leaflet-right">
      <div className="leaflet-control leaflet-bar">
        <button onClick={onClick}>現在地を表示</button>
      </div>
    </div>
  )
}
export default CurrentPosition
<MapContainer> 内に、上で作成したコントロールを配置する。
function App() {
  const [position, setPosition] = useState<LatLngTuple>([35.710304502694505, 139.81029660578832])
  return (
    <MapContainer center={position} zoom={17} scrollWheelZoom={false} style={{ height: "100vh" }}>
      <TileLayer
        attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
      />
      <CurrentPosition/>
    </MapContainer>
  )
}

0 件のコメント:
コメントを投稿