React Leaflet は、React.js フレームワークと Leaflet ライブラリを組み合わせた地図コンポーネントの作成を容易にするためのライブラリです。この記事では、多数のマーカーを扱う際に便利なマーカークラスターを react-leaflet-cluster を使って実装していきます。
マーカークラスターを使用すると、密集したマーカーをクリックやズームで、収束、展開することができます。
React Leaflet マーカーを表示と見た目をカスタマイズする方法
2023年06月09日
leafletReact-leaflet-clusterとは
React-leaflet-cluster は react-leaflet のプラグインです。 Leaflet.markercluster のラッパーコンポーネント。 React.js アプリケーションに統合して、美しくアニメーション化されたマーカー クラスタリング機能を作成する準備ができています。
パッケージのインストールとフォルダ構成
アプリを作成します。
npx create-react-app
パッケージをインストールします、leaflet と react-leaflet と react-leaflet-cluster を使用します。
npm install leaflet react-leaflet react-leaflet-cluster
ファイル構成
src //
|-- index.js
|-- index.css
|-- App.css
|-- App.js
`-- conponents //
`-- markers.js
React Leaflet マップ表示とレイヤーコントロール
2023年06月06日
leafletreact-leaflet-cluster の使い方
import {
MapContainer,
TileLayer,
} from "react-leaflet";
import "leaflet/dist/leaflet.css";
import "./App.css";
import Markers from './components/markers'
const center = [35.3628, 138.7307];
function App() {
return (
<MapContainer center={center} zoom={10} zoomControl={false} id="map">
<TileLayer
attribution='© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Markers />
</MapContainer>
);
}
export default App;
7, 18: Markers コンポーネントをインポートして表示させます。
Markers コンポーネントを作成
import { Marker } from "react-leaflet";
import L from "leaflet";
import MarkerClusterGroup from "react-leaflet-cluster";
import icon from "leaflet/dist/images/marker-icon.png";
import iconShadow from "leaflet/dist/images/marker-shadow.png";
//defaultMarker
delete L.Icon.Default.prototype._getIconUrl;
L.Icon.Default.mergeOptions({
iconUrl: icon,
shadowUrl: iconShadow,
});
function Markers() {
const center = [35.3628, 138.7307];
const point1 = [35.274774075037776, 138.6131286621094];
const point2 = [35.292710387701696, 138.9097595214844];
const createCustomCluster = (cluster) => {
var childCount = cluster.getChildCount();
var size = "marker-";
if (childCount < 7) {
size += "small";
} else if (childCount < 8) {
size += "medium";
} else {
size += "large";
}
return L.divIcon({
html: `<div class="${size} marker-cluster"><span>${childCount}</span></div>`,
});
};
return (
<MarkerClusterGroup
chunkedLoading
iconCreateFunction={createCustomCluster}
spiderfyOnMaxZoom={true}
>
<Marker position={point1} />
<Marker position={point2} />
<Marker position={center} />
<Marker position={center} />
<Marker position={center} />
<Marker position={center} />
<Marker position={center} />
<Marker position={center} />
</MarkerClusterGroup>
);
}
export default Markers;
3, 31 ~ 51: MarkerClusterGroup コンポーネントをインポートして、Marker コンポーネントを囲んで使います。
39 ~ 41: オプションを追加します。react-leaflet-cluster options
マーカークラスターの見た目を変更
40: iconCreateFunction でマーカークラスターの作成をすることができます。
15 ~ 35: getChildCount メソッドで収束されているマーカーの数を取得して、マーカー数によって別のクラスを付与して見た目を変更できたりします。
.marker-cluster {
display: flex;
align-items: center;
justify-content: center;
transform: translate(-50%, -50%);
width: 30px;
height: 30px;
padding: 10px;
border-radius: 50%;
}
.marker-small {
background: skyblue;
}
.marker-medium {
background: limegreen
}
.marker-large {
background: lightcoral;
}
以上マーカークラスター(react-leaflet-cluster) の使い方でした。