Area.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. protected $name = 'shop_area';
  12. // 开启自动写入时间戳字段
  13. protected $autoWriteTimestamp = 'int';
  14. // 定义时间戳字段名
  15. protected $createTime = false;
  16. protected $updateTime = false;
  17. // 追加属性
  18. protected $append = [
  19. ];
  20. protected static $config = [];
  21. protected static $tagCount = 0;
  22. protected static function init()
  23. {
  24. $config = get_addon_config('shop');
  25. self::$config = $config;
  26. }
  27. /**
  28. * 根据经纬度获取当前地区信息
  29. *
  30. * @param string $lng 经度
  31. * @param string $lat 纬度
  32. * @return Area|null
  33. */
  34. public static function getAreaFromLngLat($lng, $lat, $level = 3)
  35. {
  36. $namearr = [1 => 'geo:province', 2 => 'geo:city', 3 => 'geo:district'];
  37. $rangearr = [1 => 15000, 2 => 1000, 3 => 200];
  38. $geoname = isset($namearr[$level]) ? $namearr[$level] : $namearr[3];
  39. $georange = isset($rangearr[$level]) ? $rangearr[$level] : $rangearr[3];
  40. $neararea = [];
  41. // 读取范围内的ID
  42. $redis = Cache::store('redis')->handler();
  43. $georadiuslist = [];
  44. if (method_exists($redis, 'georadius')) {
  45. $georadiuslist = $redis->georadius($geoname, $lng, $lat, $georange, 'km', ['WITHDIST', 'COUNT' => 5, 'ASC']);
  46. }
  47. if ($georadiuslist) {
  48. list($id, $distance) = $georadiuslist[0];
  49. }
  50. $id = isset($id) && $id ? $id : 3;
  51. return self::get($id);
  52. }
  53. /**
  54. * 根据经纬度获取省份
  55. *
  56. * @param string $lng 经度
  57. * @param string $lat 纬度
  58. * @return array
  59. */
  60. public static function getProvinceFromLngLat($lng, $lat)
  61. {
  62. $provincedata = [];
  63. $citydata = self::getCityFromLngLat($lng, $lat);
  64. if ($citydata) {
  65. $provincedata = self::get($citydata['pid']);
  66. }
  67. return $provincedata;
  68. }
  69. /**
  70. * 根据经纬度获取城市
  71. *
  72. * @param string $lng 经度
  73. * @param string $lat 纬度
  74. * @return array
  75. */
  76. public static function getCityFromLngLat($lng, $lat)
  77. {
  78. $citydata = [];
  79. $districtdata = self::getDistrictFromLngLat($lng, $lat);
  80. if ($districtdata) {
  81. $citydata = self::get($districtdata['pid']);
  82. }
  83. return $citydata;
  84. }
  85. /**
  86. * 根据经纬度获取地区
  87. *
  88. * @param string $lng 经度
  89. * @param string $lat 纬度
  90. * @return Area|null
  91. */
  92. public static function getDistrictFromLngLat($lng, $lat)
  93. {
  94. $districtdata = self::getAreaFromLngLat($lng, $lat, 3);
  95. return $districtdata;
  96. }
  97. }