Files

137 lines
3.3 KiB
C#

//-----------------------------------------------------------------------
// <copyright file="RasterTileExample.cs" company="Mapbox">
// Copyright (c) 2016 Mapbox. All rights reserved.
// </copyright>
//-----------------------------------------------------------------------
namespace Mapbox.Examples.Playground
{
using System.Linq;
using System;
using Mapbox.Map;
using Mapbox.Unity;
using UnityEngine;
using UnityEngine.UI;
using Mapbox.Utils;
using Mapbox.Unity.Utilities;
using Mapbox.Geocoding;
public class RasterTileExample : MonoBehaviour, Mapbox.Utils.IObserver<RasterTile>
{
[SerializeField]
ForwardGeocodeUserInput _searchLocation;
[SerializeField]
Slider _zoomSlider;
[SerializeField]
Dropdown _stylesDropdown;
[SerializeField]
RawImage _imageContainer;
Map<RasterTile> _map;
[Geocode]
[SerializeField]
string _latLon;
// initialize _mapboxStyles
string[] _mapboxStyles = new string[]
{
"mapbox://styles/mapbox/satellite-v9",
"mapbox://styles/mapbox/streets-v9",
"mapbox://styles/mapbox/dark-v9",
"mapbox://styles/mapbox/light-v9"
};
// start location - San Francisco
Vector2d _startLoc = new Vector2d();
int _mapstyle = 0;
void Awake()
{
_searchLocation.OnGeocoderResponse += SearchLocation_OnGeocoderResponse;
_stylesDropdown.ClearOptions();
_stylesDropdown.AddOptions(_mapboxStyles.ToList());
_stylesDropdown.onValueChanged.AddListener(ToggleDropdownStyles);
_zoomSlider.onValueChanged.AddListener(AdjustZoom);
var parsed = _latLon.Split(',');
_startLoc.x = double.Parse(parsed[0]);
_startLoc.y = double.Parse(parsed[1]);
}
void OnDestroy()
{
if (_searchLocation != null)
{
_searchLocation.OnGeocoderResponse -= SearchLocation_OnGeocoderResponse;
}
}
void Start()
{
_map = new Map<RasterTile>(MapboxAccess.Instance);
_map.MapId = _mapboxStyles[_mapstyle];
_map.Center = _startLoc;
_map.Zoom = (int)_zoomSlider.value;
_map.Subscribe(this);
_map.Update();
}
/// <summary>
/// New search location has become available, begin a new _map query.
/// </summary>
/// <param name="sender">Sender.</param>
/// <param name="e">E.</param>
void SearchLocation_OnGeocoderResponse(ForwardGeocodeResponse response)
{
_map.Center = _searchLocation.Coordinate;
_map.Update();
}
/// <summary>
/// Zoom was modified by the slider, begin a new _map query.
/// </summary>
/// <param name="value">Value.</param>
void AdjustZoom(float value)
{
_map.Zoom = (int)_zoomSlider.value;
_map.Update();
}
/// <summary>
/// Style dropdown updated, begin a new _map query.
/// </summary>
/// <param name="value">If set to <c>true</c> value.</param>
void ToggleDropdownStyles(int target)
{
_mapstyle = target;
_map.MapId = _mapboxStyles[target];
_map.Update();
}
/// <summary>
/// Update the texture with new data.
/// </summary>
/// <param name="tile">Tile.</param>
public void OnNext(RasterTile tile)
{
if (
tile.HasError
|| (tile.CurrentState != Tile.State.Loaded && tile.CurrentState != Tile.State.Updated)
)
{
return;
}
// Can we utility this? Should users have to know source size?
var texture = new Texture2D(256, 256);
texture.LoadImage(tile.Data);
_imageContainer.texture = texture;
}
}
}