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 BaseModel
  9. {
  10. // 表名
  11. protected $name = 'area';
  12. // 自动写入时间戳字段
  13. protected $autoWriteTimestamp = 'int';
  14. // 定义时间戳字段名
  15. protected $createTime = 'createtime';
  16. protected $updateTime = 'updatetime';
  17. protected int $is_status_search = 0;// 默认使用 status = 1 筛选
  18. protected int $is_delete_search = 0;// 默认使用 is_delete = 0 筛选
  19. /**
  20. * 默认查询字段
  21. *
  22. * @var array|string[]
  23. */
  24. public array $select = [
  25. '*'
  26. ];
  27. /**
  28. * 根据经纬度获取当前地区信息
  29. *
  30. * @param string $lng 经度
  31. * @param string $lat 纬度
  32. * @return Area 城市信息
  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 = $namearr[$level] ?? $namearr[3];
  39. $georange = $rangearr[$level] ?? $rangearr[3];
  40. // 读取范围内的ID
  41. $redis = Cache::store('redis')->handler();
  42. $georadiuslist = [];
  43. if (method_exists($redis, 'georadius')) {
  44. $georadiuslist = $redis->georadius($geoname, $lng, $lat, $georange, 'km', ['WITHDIST', 'COUNT' => 5, 'ASC']);
  45. }
  46. if ($georadiuslist) {
  47. list($id, $distance) = $georadiuslist[0];
  48. }
  49. $id = isset($id) && $id ? $id : 3;
  50. return self::get($id);
  51. }
  52. /**
  53. * 根据经纬度获取省份
  54. *
  55. * @param string $lng 经度
  56. * @param string $lat 纬度
  57. * @return Area
  58. */
  59. public static function getProvinceFromLngLat($lng, $lat)
  60. {
  61. $provincedata = null;
  62. $citydata = self::getCityFromLngLat($lng, $lat);
  63. if ($citydata) {
  64. $provincedata = self::get($citydata['pid']);
  65. }
  66. return $provincedata;
  67. }
  68. /**
  69. * 根据经纬度获取城市
  70. *
  71. * @param string $lng 经度
  72. * @param string $lat 纬度
  73. * @return Area
  74. */
  75. public static function getCityFromLngLat($lng, $lat)
  76. {
  77. $citydata = null;
  78. $districtdata = self::getDistrictFromLngLat($lng, $lat);
  79. if ($districtdata) {
  80. $citydata = self::get($districtdata['pid']);
  81. }
  82. return $citydata;
  83. }
  84. /**
  85. * 根据经纬度获取地区
  86. *
  87. * @param string $lng 经度
  88. * @param string $lat 纬度
  89. * @return Area
  90. */
  91. public static function getDistrictFromLngLat($lng, $lat)
  92. {
  93. $districtdata = self::getAreaFromLngLat($lng, $lat, 3);
  94. return $districtdata;
  95. }
  96. }