You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.5 KiB
119 lines
3.5 KiB
namespace Mapbox.Unity.MeshGeneration.Data
|
|
{
|
|
using Mapbox.VectorTile;
|
|
using System.Collections.Generic;
|
|
using Mapbox.VectorTile.Geometry;
|
|
using UnityEngine;
|
|
using Mapbox.Utils;
|
|
using Mapbox.Unity.Utilities;
|
|
|
|
public class VectorFeatureUnity
|
|
{
|
|
public VectorTileFeature Data;
|
|
public Dictionary<string, object> Properties;
|
|
public List<List<Vector3>> Points = new List<List<Vector3>>();
|
|
public UnityTile Tile;
|
|
|
|
private double _rectSizex;
|
|
private double _rectSizey;
|
|
private int _geomCount;
|
|
private int _pointCount;
|
|
private List<Vector3> _newPoints = new List<Vector3>();
|
|
private List<List<Point2d<float>>> _geom;
|
|
|
|
public VectorFeatureUnity()
|
|
{
|
|
Points = new List<List<Vector3>>();
|
|
}
|
|
|
|
public VectorFeatureUnity(VectorTileFeature feature, UnityTile tile, float layerExtent, bool buildingsWithUniqueIds = false)
|
|
{
|
|
Data = feature;
|
|
Properties = Data.GetProperties();
|
|
Points.Clear();
|
|
Tile = tile;
|
|
|
|
//this is a temp hack until we figure out how streets ids works
|
|
if (buildingsWithUniqueIds == true) //ids from building dataset is big ulongs
|
|
{
|
|
_geom = feature.Geometry<float>(); //and we're not clipping by passing no parameters
|
|
}
|
|
else //streets ids, will require clipping
|
|
{
|
|
_geom = feature.Geometry<float>(0); //passing zero means clip at tile edge
|
|
}
|
|
|
|
_rectSizex = tile.Rect.Size.x;
|
|
_rectSizey = tile.Rect.Size.y;
|
|
|
|
_geomCount = _geom.Count;
|
|
for (int i = 0; i < _geomCount; i++)
|
|
{
|
|
_pointCount = _geom[i].Count;
|
|
_newPoints = new List<Vector3>(_pointCount);
|
|
for (int j = 0; j < _pointCount; j++)
|
|
{
|
|
var point = _geom[i][j];
|
|
_newPoints.Add(new Vector3((float)(point.X / layerExtent * _rectSizex - (_rectSizex / 2)) * tile.TileScale, 0, (float)((layerExtent - point.Y) / layerExtent * _rectSizey - (_rectSizey / 2)) * tile.TileScale));
|
|
}
|
|
Points.Add(_newPoints);
|
|
}
|
|
}
|
|
|
|
public VectorFeatureUnity(VectorTileFeature feature, List<List<Point2d<float>>> geom, UnityTile tile, float layerExtent, bool buildingsWithUniqueIds = false)
|
|
{
|
|
Data = feature;
|
|
Properties = Data.GetProperties();
|
|
Points.Clear();
|
|
Tile = tile;
|
|
_geom = geom;
|
|
|
|
_rectSizex = tile.Rect.Size.x;
|
|
_rectSizey = tile.Rect.Size.y;
|
|
|
|
_geomCount = _geom.Count;
|
|
for (int i = 0; i < _geomCount; i++)
|
|
{
|
|
_pointCount = _geom[i].Count;
|
|
_newPoints = new List<Vector3>(_pointCount);
|
|
for (int j = 0; j < _pointCount; j++)
|
|
{
|
|
var point = _geom[i][j];
|
|
_newPoints.Add(new Vector3((float)(point.X / layerExtent * _rectSizex - (_rectSizex / 2)) * tile.TileScale, 0, (float)((layerExtent - point.Y) / layerExtent * _rectSizey - (_rectSizey / 2)) * tile.TileScale));
|
|
}
|
|
Points.Add(_newPoints);
|
|
}
|
|
}
|
|
|
|
public bool ContainsLatLon(Vector2d coord)
|
|
{
|
|
//first check tile
|
|
var coordinateTileId = Conversions.LatitudeLongitudeToTileId(
|
|
coord.x, coord.y, Tile.CurrentZoom);
|
|
|
|
if (Points.Count > 0)
|
|
{
|
|
var from = Conversions.LatLonToMeters(coord.x, coord.y);
|
|
|
|
var to = new Vector2d((Points[0][0].x / Tile.TileScale) + Tile.Rect.Center.x, (Points[0][0].z / Tile.TileScale) + Tile.Rect.Center.y);
|
|
var dist = Vector2d.Distance(from, to);
|
|
if (Mathd.Abs(dist) < 50)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if ((!coordinateTileId.Canonical.Equals(Tile.CanonicalTileId)))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//then check polygon
|
|
var point = Conversions.LatitudeLongitudeToVectorTilePosition(coord, Tile.CurrentZoom);
|
|
var output = PolygonUtils.PointInPolygon(new Point2d<float>(point.x, point.y), _geom);
|
|
|
|
return output;
|
|
}
|
|
|
|
}
|
|
}
|
|
|