GPSTrackerLocationGrid.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Controls;
  5. using Comal.Classes;
  6. using Comal.Stores;
  7. using InABox.Clients;
  8. using InABox.Core;
  9. using InABox.DynamicGrid;
  10. using InABox.WPF;
  11. namespace PRSDesktop
  12. {
  13. internal class GPSTrackerLocationGrid : DynamicOneToManyGrid<GPSTracker, GPSTrackerLocation>
  14. {
  15. private static List<Tuple<double, double, string>> _cache;
  16. public GPSTrackerLocationGrid()
  17. {
  18. Options.AddRange(
  19. DynamicGridOption.SelectColumns,
  20. DynamicGridOption.RecordCount,
  21. DynamicGridOption.FilterRows
  22. );
  23. Criteria.Add(
  24. new Filter<GPSTrackerLocation>(x => x.Location.Timestamp).IsGreaterThanOrEqualTo(DateTime.Now.AddDays(-1))
  25. );
  26. ActionColumns.Add(new DynamicMapColumn<GPSTrackerLocation>(this, x => x.Location));
  27. AddButton("Get Addresses", null, GetAddressClick);
  28. }
  29. public string ReverseGeocode(double latitude, double longitude)
  30. {
  31. if (_cache == null)
  32. _cache = new Client<GPSTrackerLocation>().Query(
  33. new Filter<GPSTrackerLocation>(x => x.Location.Address).IsNotEqualTo(""),
  34. new Columns<GPSTrackerLocation>(
  35. x => x.Location.Address,
  36. x => x.Location.Longitude,
  37. x => x.Location.Latitude
  38. )
  39. ).Rows.Select(r => new Tuple<double, double, string>(
  40. r.Get<GPSTrackerLocation, double>(c => c.Location.Latitude),
  41. r.Get<GPSTrackerLocation, double>(c => c.Location.Longitude),
  42. r.Get<GPSTrackerLocation, string>(c => c.Location.Address)
  43. )).ToList();
  44. var tuple = _cache.FirstOrDefault(x => Equals(x.Item1, latitude) && Equals(x.Item2, longitude));
  45. if (tuple == null)
  46. {
  47. var address = StoreUtils.ReverseGeocode(latitude, longitude);
  48. if (!string.IsNullOrWhiteSpace(address))
  49. {
  50. tuple = new Tuple<double, double, string>(latitude, longitude, address);
  51. _cache.Add(tuple);
  52. }
  53. }
  54. return tuple != null ? tuple.Item3 : "";
  55. }
  56. private bool GetAddressClick(Button arg1, CoreRow[] arg2)
  57. {
  58. var result = false;
  59. var rows = Data.Rows.Where(r =>
  60. string.IsNullOrWhiteSpace(r.Get<GPSTrackerLocation, string>(c => c.Location.Address))
  61. && !Equals(r.Get<GPSTrackerLocation, double>(c => c.Location.Latitude), 0.0F)
  62. && !Equals(r.Get<GPSTrackerLocation, double>(c => c.Location.Longitude), 0.0F)
  63. );
  64. Progress.ShowModal("Updating Addresses", progress =>
  65. {
  66. foreach (var row in rows)
  67. {
  68. var item = LoadItem(row);
  69. var address = ReverseGeocode(
  70. row.Get<GPSTrackerLocation, double>(x => x.Location.Latitude),
  71. row.Get<GPSTrackerLocation, double>(x => x.Location.Longitude)
  72. );
  73. if (!string.IsNullOrWhiteSpace(address))
  74. {
  75. item.Location.Address = address;
  76. UpdateRow<GPSTrackerLocation, string>(row, x => x.Location.Address, address, false);
  77. result = true;
  78. }
  79. }
  80. });
  81. return result;
  82. }
  83. }
  84. }