react-native-maps-use-cluster
v1.0.4
Published
A hook for managing Marker cluster for react-native-maps.
Downloads
12
Maintainers
Readme
react-native-maps-use-cluster
A simple hook for clustering markers for react-native-maps
.
Completely inspired by react-native-maps-super-cluster, most of credit goes back to their maintainers and contributors.
Installation
yarn add react-native-maps-use-cluster
Usage
Here is the quick how-to example:
import React, { useRef, useState } from "react";
import { Dimensions } from "react-native";
import { useCluster } from "react-native-maps-use-cluster";
const App = () => {
const mapViewRef = useRef<MapView>();
const [region, setRegion] = useState<Region | undefined>();
const { clusters, getCoordinates } = useCluster<
{ marker: IMarker } & IUseClusterItem
>({
items: markerInfo.map(marker => ({
coordinate: marker,
marker
})),
region,
width: Dimensions.get("window").width,
height: Dimensions.get("window").height
});
const onClusterPress = cluster => {
if (mapViewRef.current) {
const coordinates = getCoordinates(cluster.properties.cluster_id);
if (coordinates && coordinates.length) {
mapViewRef.current.fitToCoordinates(coordinates, {
edgePadding: {
top: 10,
bottom: 10,
right: 10,
left: 10
},
animated: true
});
}
}
};
const markers = clusters.map(cluster => {
if (!cluster.properties) {
return null;
}
if (cluster.properties.point_count === 0) {
const { marker } = cluster.properties.item;
return <Marker coordinate={marker} key={marker.id} />;
} else {
return (
<Marker
key={cluster.properties.cluster_id}
coordinate={{
latitude: cluster.geometry.coordinates[1],
longitude: cluster.geometry.coordinates[0]
}}
onPress={() => {
onClusterPress(cluster);
}}
style={{ zIndex: 99 }}
>
<View
style={{
backgroundColor: "red",
height: 20,
width: 20,
borderRadius: 20,
alignItems: "center"
}}
>
<Text style={{ color: "white" }}>
{cluster.properties.point_count}
</Text>
</View>
</Marker>
);
}
});
return (
<MapView
provider={"google"}
ref={ref => (mapViewRef.current = ref || undefined)}
style={styles.map}
onRegionChangeComplete={setRegion}
>
{markers}
</MapView>
);
};
For complete demo, see examples/expo
.