RealWorldTerrainUContextActions.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* INFINITY CODE 2013-2019 */
  2. /* http://www.infinity-code.com */
  3. #if UCONTEXT
  4. using System.Diagnostics;
  5. using InfinityCode.RealWorldTerrain.ExtraTypes;
  6. using InfinityCode.RealWorldTerrain.JSON;
  7. using InfinityCode.RealWorldTerrain.Tools;
  8. using InfinityCode.uContext;
  9. using InfinityCode.uContext.Actions;
  10. using InfinityCode.uContext.Windows;
  11. using UnityEditor;
  12. using UnityEngine;
  13. using Debug = UnityEngine.Debug;
  14. namespace InfinityCode.RealWorldTerrain.ThirdParty
  15. {
  16. public class RealWorldTerrainUContextActions: ActionItem, IValidatableLayoutItem
  17. {
  18. protected override bool closeOnSelect
  19. {
  20. get { return false; }
  21. }
  22. private void Geocode()
  23. {
  24. uContextMenu.Close();
  25. InputDialog.Show("Input Location Name", "Location Name", OnInputLocationName);
  26. }
  27. protected override void Init()
  28. {
  29. Texture2D icon = RealWorldTerrainResources.GetIcon("RWT-uContext");
  30. _guiContent = new GUIContent(icon, "Real World Terrain");
  31. }
  32. public override void Invoke()
  33. {
  34. GenericMenu menu = new GenericMenu();
  35. menu.AddItem(new GUIContent("Find Location By Name"), false, Geocode);
  36. menu.AddItem(new GUIContent("Find Location Name Under Cursor"), false, ReverseGeocode);
  37. menu.AddItem(new GUIContent("Place Object"), false, ShowObjectPlacer);
  38. menu.AddItem(new GUIContent("Show Google Maps"), false, ShowGoogleMaps);
  39. menu.AddItem(new GUIContent("Show Google Street View"), false, ShowGoogleStreetView);
  40. menu.AddItem(new GUIContent("Show Open Street Map"), false, ShowOpenStreetMap);
  41. menu.ShowAsContext();
  42. }
  43. private void OnGeocodeComplete(RealWorldTerrainWWW www)
  44. {
  45. if (!string.IsNullOrEmpty(www.error))
  46. {
  47. Debug.Log(www.error);
  48. return;
  49. }
  50. RealWorldTerrainJsonItem json = RealWorldTerrainJson.Parse(www.text);
  51. RealWorldTerrainJsonItem firstItem = json["candidates/0"];
  52. if (firstItem == null) return;
  53. RealWorldTerrainJsonItem location = firstItem["location"];
  54. double cx = location.V<double>("x"), cy = location.V<double>("y");
  55. RealWorldTerrainContainer container = Object.FindObjectOfType<RealWorldTerrainContainer>();
  56. if (container == null) return;
  57. Vector3 worldPos;
  58. if (!container.GetWorldPosition(cx, cy, out worldPos)) return;
  59. GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
  60. go.name = firstItem.V<string>("address");
  61. go.transform.position = worldPos;
  62. Bounds bounds = go.GetComponent<Renderer>().bounds;
  63. bounds.size *= 5;
  64. SceneView.lastActiveSceneView.Frame(bounds);
  65. }
  66. private void OnInputLocationName(string locationName)
  67. {
  68. RealWorldTerrainContainer container = Object.FindObjectOfType<RealWorldTerrainContainer>();
  69. new RealWorldTerrainWWW(
  70. "http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/findAddressCandidates?f=pjson&address=" +
  71. RealWorldTerrainWWW.EscapeURL(locationName) + "&searchExtent=" +
  72. container.leftLongitude.ToString(RealWorldTerrainCultureInfo.numberFormat) + "," +
  73. container.topLatitude.ToString(RealWorldTerrainCultureInfo.numberFormat) + "," +
  74. container.rightLongitude.ToString(RealWorldTerrainCultureInfo.numberFormat) + "," +
  75. container.bottomLatitude.ToString(RealWorldTerrainCultureInfo.numberFormat)
  76. ).OnComplete += OnGeocodeComplete;
  77. }
  78. private void OnReverseGeocodeComplete(RealWorldTerrainWWW www)
  79. {
  80. if (!string.IsNullOrEmpty(www.error))
  81. {
  82. Debug.Log(www.error);
  83. return;
  84. }
  85. RealWorldTerrainJsonItem json = RealWorldTerrainJson.Parse(www.text);
  86. Debug.Log(json["address/LongLabel"].V<string>());
  87. }
  88. private void ReverseGeocode()
  89. {
  90. uContextMenu.Close();
  91. RealWorldTerrainContainer container = Object.FindObjectOfType<RealWorldTerrainContainer>();
  92. if (container == null) return;
  93. double lng, lat, alt;
  94. container.GetCoordinatesByWorldPosition(uContextMenu.lastWorldPosition, out lng, out lat, out alt);
  95. new RealWorldTerrainWWW(
  96. "http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode?f=pjson&location=" + lng.ToString(RealWorldTerrainCultureInfo.numberFormat) + "," + lat.ToString(RealWorldTerrainCultureInfo.numberFormat)
  97. ).OnComplete += OnReverseGeocodeComplete;
  98. }
  99. private void ShowGoogleMaps()
  100. {
  101. uContextMenu.Close();
  102. RealWorldTerrainContainer container = Object.FindObjectOfType<RealWorldTerrainContainer>();
  103. if (container == null) return;
  104. double lng, lat;
  105. if (!container.GetCoordinatesByWorldPosition(uContextMenu.lastWorldPosition, out lng, out lat)) return;
  106. Process.Start("https://www.google.com/maps/@?api=1&map_action=map&basemap=satellite&zoom=19&center=" + lat.ToString(RealWorldTerrainCultureInfo.numberFormat) + "," + lng.ToString(RealWorldTerrainCultureInfo.numberFormat));
  107. }
  108. private void ShowGoogleStreetView()
  109. {
  110. uContextMenu.Close();
  111. RealWorldTerrainContainer container = Object.FindObjectOfType<RealWorldTerrainContainer>();
  112. if (container == null) return;
  113. double lng, lat;
  114. if (!container.GetCoordinatesByWorldPosition(uContextMenu.lastWorldPosition, out lng, out lat)) return;
  115. Process.Start("https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=" + lat.ToString(RealWorldTerrainCultureInfo.numberFormat) + "," + lng.ToString(RealWorldTerrainCultureInfo.numberFormat));
  116. }
  117. private void ShowObjectPlacer()
  118. {
  119. uContextMenu.Close();
  120. RealWorldTerrainContainer container = Object.FindObjectOfType<RealWorldTerrainContainer>();
  121. if (container == null) return;
  122. double lng, lat;
  123. if (!container.GetCoordinatesByWorldPosition(uContextMenu.lastWorldPosition, out lng, out lat)) return;
  124. RealWorldTerrainObjectPlacerWindow.OpenWindow(container, lng, lat);
  125. }
  126. private void ShowOpenStreetMap()
  127. {
  128. uContextMenu.Close();
  129. RealWorldTerrainContainer container = Object.FindObjectOfType<RealWorldTerrainContainer>();
  130. if (container == null) return;
  131. double lng, lat;
  132. if (!container.GetCoordinatesByWorldPosition(uContextMenu.lastWorldPosition, out lng, out lat)) return;
  133. Process.Start(string.Format(RealWorldTerrainCultureInfo.numberFormat, "http://www.openstreetmap.org/#map={0}/{1}/{2}", 19, lat, lng));
  134. }
  135. public bool Validate()
  136. {
  137. return Object.FindObjectOfType<RealWorldTerrainContainer>() != null;
  138. }
  139. }
  140. }
  141. #endif