Area.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace app\common\model;
  3. use think\Cache;
  4. use think\Model;
  5. /**
  6. * 地区数据模型
  7. */
  8. class Area extends Model
  9. {
  10. /**
  11. * 根据经纬度获取当前地区信息
  12. *
  13. * @param string $lng 经度
  14. * @param string $lat 纬度
  15. * @return array 城市信息
  16. */
  17. public static function getAreaFromLngLat($lng, $lat, $level = 3)
  18. {
  19. $namearr = [1 => 'geo:province', 2 => 'geo:city', 3 => 'geo:district'];
  20. $rangearr = [1 => 15000, 2 => 1000, 3 => 200];
  21. $geoname = isset($namearr[$level]) ? $namearr[$level] : $namearr[3];
  22. $georange = isset($rangearr[$level]) ? $rangearr[$level] : $rangearr[3];
  23. $neararea = [];
  24. // 读取范围内的ID
  25. $redis = Cache::store('redis')->handler();
  26. $georadiuslist = [];
  27. if (method_exists($redis, 'georadius'))
  28. {
  29. $georadiuslist = $redis->georadius($geoname, $lng, $lat, $georange, 'km', ['WITHDIST', 'COUNT' => 5, 'ASC']);
  30. }
  31. if ($georadiuslist)
  32. {
  33. list($id, $distance) = $georadiuslist[0];
  34. }
  35. $id = isset($id) && $id ? $id : 3;
  36. return self::get($id);
  37. }
  38. /**
  39. * 根据经纬度获取省份
  40. *
  41. * @param string $lng 经度
  42. * @param string $lat 纬度
  43. * @return array
  44. */
  45. public static function getProvinceFromLngLat($lng, $lat)
  46. {
  47. $provincedata = [];
  48. $citydata = self::getCityFromLngLat($lng, $lat);
  49. if ($citydata)
  50. {
  51. $provincedata = self::get($citydata['pid']);
  52. }
  53. return $provincedata;
  54. }
  55. /**
  56. * 根据经纬度获取城市
  57. *
  58. * @param string $lng 经度
  59. * @param string $lat 纬度
  60. * @return array
  61. */
  62. public static function getCityFromLngLat($lng, $lat)
  63. {
  64. $citydata = [];
  65. $districtdata = self::getDistrictFromLngLat($lng, $lat);
  66. if ($districtdata)
  67. {
  68. $citydata = self::get($districtdata['pid']);
  69. }
  70. return $citydata;
  71. }
  72. /**
  73. * 根据经纬度获取地区
  74. *
  75. * @param string $lng 经度
  76. * @param string $lat 纬度
  77. * @return array
  78. */
  79. public static function getDistrictFromLngLat($lng, $lat)
  80. {
  81. $districtdata = self::getAreaFromLngLat($lng, $lat, 3);
  82. return $districtdata;
  83. }
  84. }