Area.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 Area 城市信息
  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. // 读取范围内的ID
  24. $redis = Cache::store('redis')->handler();
  25. $georadiuslist = [];
  26. if (method_exists($redis, 'georadius')) {
  27. $georadiuslist = $redis->georadius($geoname, $lng, $lat, $georange, 'km', ['WITHDIST', 'COUNT' => 5, 'ASC']);
  28. }
  29. if ($georadiuslist) {
  30. list($id, $distance) = $georadiuslist[0];
  31. }
  32. $id = isset($id) && $id ? $id : 3;
  33. return self::get($id);
  34. }
  35. /**
  36. * 根据经纬度获取省份
  37. *
  38. * @param string $lng 经度
  39. * @param string $lat 纬度
  40. * @return Area
  41. */
  42. public static function getProvinceFromLngLat($lng, $lat)
  43. {
  44. $provincedata = null;
  45. $citydata = self::getCityFromLngLat($lng, $lat);
  46. if ($citydata) {
  47. $provincedata = self::get($citydata['pid']);
  48. }
  49. return $provincedata;
  50. }
  51. /**
  52. * 根据经纬度获取城市
  53. *
  54. * @param string $lng 经度
  55. * @param string $lat 纬度
  56. * @return Area
  57. */
  58. public static function getCityFromLngLat($lng, $lat)
  59. {
  60. $citydata = null;
  61. $districtdata = self::getDistrictFromLngLat($lng, $lat);
  62. if ($districtdata) {
  63. $citydata = self::get($districtdata['pid']);
  64. }
  65. return $citydata;
  66. }
  67. /**
  68. * 根据经纬度获取地区
  69. *
  70. * @param string $lng 经度
  71. * @param string $lat 纬度
  72. * @return Area
  73. */
  74. public static function getDistrictFromLngLat($lng, $lat)
  75. {
  76. $districtdata = self::getAreaFromLngLat($lng, $lat, 3);
  77. return $districtdata;
  78. }
  79. }