OpenLayers Clustering¶
This notebook demonstrates OpenLayers' built-in point clustering feature.
In [ ]:
Copied!
# %pip install anymap-ts
# %pip install anymap-ts
In [ ]:
Copied!
import random
from anymap_ts import OpenLayersMap
import random
from anymap_ts import OpenLayersMap
Generate Sample Data¶
In [ ]:
Copied!
random.seed(42)
features = []
clusters = [
{"center": [-122.4, 37.8], "name": "SF Area", "count": 150},
{"center": [-118.2, 34.05], "name": "LA Area", "count": 200},
{"center": [-73.98, 40.75], "name": "NYC Area", "count": 250},
{"center": [-87.63, 41.88], "name": "Chicago Area", "count": 120},
{"center": [-95.37, 29.76], "name": "Houston Area", "count": 100},
{"center": [-112.07, 33.45], "name": "Phoenix Area", "count": 80},
]
for cluster in clusters:
cx, cy = cluster["center"]
for i in range(cluster["count"]):
features.append(
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
cx + random.gauss(0, 0.5),
cy + random.gauss(0, 0.5),
],
},
"properties": {
"region": cluster["name"],
"value": random.randint(1, 100),
},
}
)
point_data = {"type": "FeatureCollection", "features": features}
print(f"Generated {len(features)} points across {len(clusters)} regions")
random.seed(42)
features = []
clusters = [
{"center": [-122.4, 37.8], "name": "SF Area", "count": 150},
{"center": [-118.2, 34.05], "name": "LA Area", "count": 200},
{"center": [-73.98, 40.75], "name": "NYC Area", "count": 250},
{"center": [-87.63, 41.88], "name": "Chicago Area", "count": 120},
{"center": [-95.37, 29.76], "name": "Houston Area", "count": 100},
{"center": [-112.07, 33.45], "name": "Phoenix Area", "count": 80},
]
for cluster in clusters:
cx, cy = cluster["center"]
for i in range(cluster["count"]):
features.append(
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
cx + random.gauss(0, 0.5),
cy + random.gauss(0, 0.5),
],
},
"properties": {
"region": cluster["name"],
"value": random.randint(1, 100),
},
}
)
point_data = {"type": "FeatureCollection", "features": features}
print(f"Generated {len(features)} points across {len(clusters)} regions")
Basic Clustering¶
In [ ]:
Copied!
m = OpenLayersMap(center=[-98, 38], zoom=4, height="600px")
m.add_basemap("OpenStreetMap")
m.add_cluster_layer(
point_data,
name="clusters",
distance=50,
)
m
m = OpenLayersMap(center=[-98, 38], zoom=4, height="600px")
m.add_basemap("OpenStreetMap")
m.add_cluster_layer(
point_data,
name="clusters",
distance=50,
)
m
Custom Cluster Colors¶
In [ ]:
Copied!
m = OpenLayersMap(center=[-98, 38], zoom=4, height="600px")
m.add_basemap("CartoDB.Positron")
m.add_cluster_layer(
point_data,
name="custom-clusters",
distance=60,
min_distance=25,
cluster_color="rgba(231, 76, 60, 0.7)",
point_color="rgba(231, 76, 60, 0.9)",
text_color="#fff",
)
m
m = OpenLayersMap(center=[-98, 38], zoom=4, height="600px")
m.add_basemap("CartoDB.Positron")
m.add_cluster_layer(
point_data,
name="custom-clusters",
distance=60,
min_distance=25,
cluster_color="rgba(231, 76, 60, 0.7)",
point_color="rgba(231, 76, 60, 0.9)",
text_color="#fff",
)
m
Tight Clustering¶
Use a smaller distance to show more individual points.
In [ ]:
Copied!
m = OpenLayersMap(center=[-98, 38], zoom=4, height="600px")
m.add_basemap("CartoDB.DarkMatter")
m.add_cluster_layer(
point_data,
name="tight-clusters",
distance=25,
min_distance=10,
cluster_color="rgba(46, 204, 113, 0.8)",
point_color="rgba(46, 204, 113, 1.0)",
)
m
m = OpenLayersMap(center=[-98, 38], zoom=4, height="600px")
m.add_basemap("CartoDB.DarkMatter")
m.add_cluster_layer(
point_data,
name="tight-clusters",
distance=25,
min_distance=10,
cluster_color="rgba(46, 204, 113, 0.8)",
point_color="rgba(46, 204, 113, 1.0)",
)
m