public static Vector2 GetTileSizeInMeters(Tile tile)
    {
        Vector2 nw = GetMetersFromCoordinate(GeoPositioningHelper.GetNWCoordinateFromTile(tile));
        Vector2 se = GetMetersFromCoordinate(GeoPositioningHelper.GetNWCoordinateFromTile(new Tile(tile.X + 1, tile.Y + 1, tile.Zoom)));

        return(new Vector2(Math.Abs(nw.x - se.x), Math.Abs(nw.y - se.y)));
    }
Beispiel #2
0
    private void Start()
    {
        OriginInMeters = GeoPositioningHelper.GetMetersFromCoordinate(new Coordinate(OriginLatitude, OriginLongitude));

        osmFileParsers    = new List <MultithreadedOsmFileParser>();
        osmGeoJSONParsers = new List <MultithreadedOsmGeoJSONParser>();

        NetworkManager.Instance.OnDowloaded.AddListener(OnNetworkResponse);
    }
    private string BuildOsmFileRequest(Tile tile)
    {
        BBox bBox = GeoPositioningHelper.GetBBoxFromTile(tile);

        return(string.Format(StringConstants.OSMTileRequestPattern,
                             Convert.ToString(bBox.MinLongitude, CultureInfoHelper.EnUSInfo),
                             Convert.ToString(bBox.MinLatitude, CultureInfoHelper.EnUSInfo),
                             Convert.ToString(bBox.MaxLongitude, CultureInfoHelper.EnUSInfo),
                             Convert.ToString(bBox.MaxLatitude, CultureInfoHelper.EnUSInfo)));
    }
 public MultithreadedSurfacePainter(int mapWidth,
                                    Tile tile, PriorityQueue <Road> roadsQueue, PriorityQueue <Area> areasQueue,
                                    Dictionary <string, int> nameToTerrainLayer)
 {
     Tile                    = tile;
     tileSizeInMeters        = GeoPositioningHelper.GetTileSizeInMeters(tile);
     this.mapWidth           = mapWidth;
     this.roadsQueue         = roadsQueue;
     this.areasQueue         = areasQueue;
     this.nameToTerrainLayer = nameToTerrainLayer;
 }
Beispiel #5
0
    public OsmFile(string file)
    {
        keyToNode = new Dictionary <string, OsmNode>();
        keyToWay  = new Dictionary <string, OsmWay>();

        XmlDocument document = new XmlDocument();

        document.LoadXml(file);
        XmlElement root = document.DocumentElement;

        foreach (XmlNode node in root)
        {
            if (node.Name == "node")
            {
                Vector2 coordinates = GeoPositioningHelper.GetMetersFromCoordinate(
                    new Coordinate(
                        Convert.ToSingle(node.Attributes.GetNamedItem("lat").Value, CultureInfoHelper.EnUSInfo),
                        Convert.ToSingle(node.Attributes.GetNamedItem("lon").Value, CultureInfoHelper.EnUSInfo)
                        ));

                keyToNode.Add(node.Attributes.GetNamedItem("id").Value, new OsmNode(coordinates));
            }
        }

        foreach (XmlNode node in root)
        {
            if (node.Name == "way")
            {
                OsmWay way = new OsmWay();

                foreach (XmlNode subNode in node.ChildNodes)
                {
                    if (subNode.Name == "nd")
                    {
                        string key = subNode.Attributes.GetNamedItem("ref").Value;
                        way.AddNode(keyToNode[key]);
                        continue;
                    }

                    if (subNode.Name == "tag")
                    {
                        string key   = subNode.Attributes.GetNamedItem("k").Value;
                        string value = subNode.Attributes.GetNamedItem("v").Value;
                        value = char.ToUpper(value[0]) + value.Substring(1);
                        way.AddTagValue(key, value);
                    }
                }

                keyToWay.Add(node.Attributes.GetNamedItem("id").Value, way);
            }
        }
    }
Beispiel #6
0
    private void UpdateTerrainTransform(Tile centerTile)
    {
        Vector2 nw = GeoPositioningHelper.GetMetersFromCoordinate(GeoPositioningHelper.GetNWCoordinateFromTile(centerTile));
        Vector2 se = GeoPositioningHelper.GetMetersFromCoordinate(GeoPositioningHelper.GetNWCoordinateFromTile(new Tile(centerTile.X + 1, centerTile.Y + 1, centerTile.Zoom)));

        tileSizeInMeters = new Vector2(Math.Abs(nw.x - se.x), Math.Abs(nw.y - se.y));

        Vector2 position = (nw + se) / 2 - VisualizingManager.Instance.OriginInMeters;

        Terrain.terrainData.size = new Vector3(tileSizeInMeters.x * 3, Terrain.terrainData.size.y, tileSizeInMeters.y * 3);
        Terrain.gameObject.transform.position = new Vector3(position.x - Terrain.terrainData.size.x / 2, 0,
                                                            position.y - Terrain.terrainData.size.z / 2);
    }
Beispiel #7
0
    public static PolygonLoops GetPolygonLoopsInMeters(BAMCIS.GeoJSON.Polygon polygon, Vector2 originInMeters)
    {
        Vector2[]   outerLoop = null;
        Vector2[][] holeLoops = new Vector2[polygon.Coordinates.Count() - 1][];

        bool isOuterLoop = true;

        int i = 0;

        foreach (var linearRing in polygon.Coordinates)
        {
            List <Vector2> loop = new List <Vector2>(linearRing.Coordinates.Count() - 1);

            foreach (var position in linearRing.Coordinates)
            {
                Vector2 positionInMeters = GeoPositioningHelper.GetMetersFromCoordinate(
                    new Coordinate(
                        (float)position.Latitude,
                        (float)position.Longitude
                        )) - originInMeters;
                loop.Add(positionInMeters);
            }

            loop = loop.Distinct().Reverse().ToList();

            if (isOuterLoop)
            {
                outerLoop = loop.ToArray();
            }
            else
            {
                holeLoops[i - 1] = loop.ToArray();
            }

            isOuterLoop = false;
            i++;
        }

        return(new PolygonLoops(outerLoop, holeLoops));
    }
    private void RetrieveRoads(Tile tile, List <Road> roads, List <Area> areas)
    {
        Vector2 tileOrigin = GeoPositioningHelper.GetMetersFromCoordinate(
            GeoPositioningHelper.GetNWCoordinateFromTile(
                new Tile(tile.X, tile.Y + 1, tile.Zoom)));

        roadsQueue = new PriorityQueue <Road>();
        areasQueue = new PriorityQueue <Area>();

        foreach (var road in roads)
        {
            roadsQueue.Enqueue(new Road(road.Lanes, road.Width,
                                        road.GetNodesRelatedToOrigin(tileOrigin),
                                        road.Type));
        }

        foreach (var area in areas)
        {
            areasQueue.Enqueue(new Area(
                                   area.GetNodesRelatedToOrigin(tileOrigin), area.Type));
        }
    }
    private void InstantiateTile(Tile tile, int[,] surfaceMap)
    {
        Vector2 tileSize   = GeoPositioningHelper.GetTileSizeInMeters(tile);
        Vector2 position2D = GeoPositioningHelper.GetMetersFromCoordinate(GeoPositioningHelper.GetNWCoordinateFromTile(tile)) - VisualizingManager.Instance.OriginInMeters;
        Vector3 position   = new Vector3(position2D.x + tileSize.x / 2, 0, position2D.y - tileSize.y / 2);
        Vector3 scale      = new Vector3(tileSize.x, 0, tileSize.y) / 10;

        for (int l = 0; l < SurfaceLayers.Length; l++)
        {
            Texture2D mask = new Texture2D(surfaceMap.GetLength(0), surfaceMap.GetLength(1));

            for (int i = 0; i < surfaceMap.GetLength(0); i++)
            {
                for (int j = 0; j < surfaceMap.GetLength(1); j++)
                {
                    if (surfaceMap[surfaceMap.GetLength(0) - 1 - i, surfaceMap.GetLength(1) - 1 - j] == l)
                    {
                        mask.SetPixel(i, j, Color.white);
                    }
                    else
                    {
                        mask.SetPixel(i, j, Color.clear);
                    }
                }
            }

            mask.Apply();

            GameObject tileObject = Instantiate(SurfacePrefab);
            Material   material   = tileObject.GetComponent <MeshRenderer>().material;
            material.mainTextureScale = Vector2.one * SurfaceLayers[l].Tiling;
            material.SetTexture("_MainTex", SurfaceLayers[l].Texture);
            material.SetTexture("_Alpha", mask);
            tileObject.transform.position   = position;
            tileObject.transform.localScale = scale;
            gameObjectTilemap.AttachObjectToTile(tile, tileObject);
        }
    }
Beispiel #10
0
    private void Update()
    {
        Vector2 cameraPositionInMeters = new Vector2(Camera.main.transform.position.x, Camera.main.transform.position.z);

        cameraPositionInMeters += OriginInMeters;
        cameraPositionInMeters += new Vector2(-NumericConstants.TILE_SIZE, NumericConstants.TILE_SIZE);

        Tile currentTile = GeoPositioningHelper.GetTileFromCoordinate(
            GeoPositioningHelper.GetCoordinateFromMeters(cameraPositionInMeters),
            Zoom);

        if (Tilemap.CenterTile != currentTile)
        {
            Tilemap.UpdateCenterTile(currentTile);

            for (int i = 0; i < osmFileParsers.Count; i++)
            {
                if (Tilemap.IsTileOnMap(osmFileParsers[i].Tile))
                {
                    osmFileParsers.RemoveAt(i);
                    break;
                }
            }

            for (int i = 0; i < osmGeoJSONParsers.Count; i++)
            {
                if (Tilemap.IsTileOnMap(osmGeoJSONParsers[i].Tile))
                {
                    osmGeoJSONParsers.RemoveAt(i);
                    break;
                }
            }
        }

        if (Tilemap.HasTilesToRemove())
        {
            OnTileRemoved.Invoke(Tilemap.DequeueTileToRemove());
        }

        if (Tilemap.HasTilesToVisualize())
        {
            DownloadAndVisualizeTile(Tilemap.DequeueTileToVisualize());
        }

        for (int i = 0; i < osmFileParsers.Count; i++)
        {
            if (osmFileParsers[i].IsCompleted)
            {
                OnOsmFileParsed.Invoke(osmFileParsers[i]);
                osmFileParsers.RemoveAt(i);
                break;
            }
        }

        for (int i = 0; i < osmGeoJSONParsers.Count; i++)
        {
            if (osmGeoJSONParsers[i].IsCompleted)
            {
                OnGeoJSONParsed.Invoke(osmGeoJSONParsers[i]);
                osmGeoJSONParsers.RemoveAt(i);
                break;
            }
        }
    }