Hello.
Example of clustering 3D Markers:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class Group3DMarkers:MonoBehaviour
{
public GameObject prefab;
public GameObject groupPrefab;
public int countMarkers = 100;
public float distance = 30f / OnlineMapsUtils.tileSize; // pixels / 256
private List<OnlineMapsMarker3D> markers;
private void Start()
{
markers = new List<OnlineMapsMarker3D>();
for (int i = 0; i < countMarkers; i++)
{
OnlineMapsMarker3D marker = OnlineMapsControlBase3D.instance.AddMarker3D(new Vector2(Random.Range(-180f, 180f), Random.Range(-80, 80)), prefab);
marker.label = "Marker " + i;
markers.Add(marker);
}
GroupMarkers();
}
private void GroupMarkers()
{
List<MarkerGroup> groups = new List<MarkerGroup>();
float sqrDist = distance * distance;
OnlineMaps map = OnlineMaps.instance;
for (int zoom = OnlineMaps.MAXZOOM; zoom >= 3; zoom--)
{
List<OnlineMapsMarker3D> ms = markers.ToList();
for (int j = 0; j < ms.Count - 1; j++)
{
OnlineMapsMarker3D marker = ms[j];
MarkerGroup group = null;
double px, py;
marker.GetPosition(out px, out py);
map.projection.CoordinatesToTile(px, py, zoom, out px, out py);
int k = j + 1;
while (k < ms.Count)
{
OnlineMapsMarker3D marker2 = ms[k];
double p2x, p2y;
marker2.GetPosition(out p2x, out p2y);
map.projection.CoordinatesToTile(p2x, p2y, zoom, out p2x, out p2y);
if (OnlineMapsUtils.SqrMagnitude(px, py, p2x, p2y) < sqrDist)
{
if (group == null)
{
group = new MarkerGroup(zoom, groupPrefab);
groups.Add(group);
group.Add(marker);
if (marker.range.min == 3) marker.range.min = zoom + 1;
}
group.Add(marker2);
if (marker2.range.min == 3) marker2.range.min = zoom + 1;
ms.RemoveAt(k);
px = group.tilePositionX;
py = group.tilePositionY;
}
else k++;
}
}
}
}
internal class MarkerGroup
{
public readonly List<OnlineMapsMarker3D> markers;
public readonly OnlineMapsMarker3D instance;
public Vector2 center;
public double tilePositionX, tilePositionY;
public int zoom;
public MarkerGroup(int zoom, GameObject prefab)
{
markers = new List<OnlineMapsMarker3D>();
this.zoom = zoom;
instance = OnlineMapsControlBase3D.instance.AddMarker3D(Vector2.zero, prefab);
instance.range = new OnlineMapsRange(zoom, zoom);
}
public void Add(OnlineMapsMarker3D marker)
{
markers.Add(marker);
center = markers.Aggregate(Vector2.zero, (current, m) => current + m.position) / markers.Count;
instance.position = center;
OnlineMaps.instance.projection.CoordinatesToTile(center.x, center.y, zoom, out tilePositionX, out tilePositionY);
instance.label = "Group. Count: " + markers.Count;
}
}
}
However, clustering does not help solve the problem of a large number of markers.
For each marker (even inactive) made a some number of operations in each frame.
To have a great performance, you need to help map and reduce the number of markers.
For example:
http://forum.infinity-code.com/viewtopi … d=650#p650
Kind Regards,
Infinity Code Team.
Boost your productivity a lot and immediately using
Ultimate Editor Enhancer.
Trial and non-commerce versions available.