验证坐标在某坐标区域内php代码

5年以前  |  阅读数:643 次  |  编程语言:PHP 

之前碰到的这样一个需求,要将公司的服务在地图中显示出来,并将用户每天的访问坐标进行统计看有多少用户是在所能达到的服务范围半径内。

以下是PHP代码的实现 (仅验证坐标在某片坐标区域内)


    <?php
    /**
     * 验证坐标点是否在某区域内
     * @author xiaoliang <1058436713@qq.com>
     * Class validationMap
     */
    class validationMap{
     private static $coordArray;
     private static $vertx = [];
     private static $verty = [];
     /**
      * 设置坐标区域
      * @param mixed $coordArray
      */
     public static function setCoordArray(array $coordArray)
     {
      self::$coordArray = $coordArray;
     }
     /**
      * 验证区域范围
      * @param array $coordArray
      * @return bool
      */
     public static function isCityCenter(array $coordArray){
      if(!self::vaildatePoint($coordArray)){
       return false;
      }
      return self::pnpoly(count(self::$coordArray), $coordArray['lng'], $coordArray['lat']);
     }
     /**
      * 比较区域坐标
      * @param $nvert
      * @param $testx
      * @param $testy
      * @return bool
      */
     private static function pnpoly($nvert,$testx, $testy)
     {
      $c = false;
      for ($i = 0, $j = $nvert-1; $i < $nvert; $j = $i++) {
       if ( ( (self::$verty[$i]>$testy) != (self::$verty[$j]>$testy) ) && ($testx < (self::$vertx[$j]-self::$vertx[$i]) * ($testy-self::$verty[$i]) / (self::$verty[$j]-self::$verty[$i]) + self::$vertx[$i]) )
        $c = !$c;
      }
      return $c;
     }
     /**
      * 验证坐标
      * @param array $pointArray
      * @return bool
      */
     private static function vaildatePoint(array $pointArray){
      $maxY = $maxX = 0;
      $minY = $minX = 9999;
      foreach (self::$coordArray as $item){
       if($item['lng']>$maxX) $maxX = $item['lng'];
       if($item['lng'] < $minX) $minX = $item['lng'];
       if($item['lat']>$maxY) $maxY = $item['lat'];
       if($item['lat'] < $minY) $minY = $item['lat'];
       self::$vertx[] = $item['lng'];
       self::$verty[] = $item['lat'];
      }
      if ($pointArray['lng'] < $minX || $pointArray['lng'] > $maxX || $pointArray['lat'] < $minY || $pointArray['lat'] > $maxY) {
       return false;
      }
      return true;
     }
    }
    /**************************** test *************************************/
    $map = [ //上海
     ["lng" => 121.488286, "lat" => 31.420147],
     ["lng" => 121.702154, "lat" => 31.294828],
     ["lng" => 121.780918, "lat" => 31.141157],
     ["lng" => 121.782068, "lat" => 30.941157],
     ["lng" => 121.492885, "lat" => 30.909931],
     ["lng" => 121.22325, "lat" => 30.890099],
     ["lng" => 121.161482, "lat" => 31.015526],
     ["lng" => 121.076395, "lat" => 31.226239],
     ["lng" => 121.189873, "lat" => 31.339688],
     ["lng" => 121.459509, "lat" => 31.41368],
    ];
    $array = ["lat"=>31.218681,"lng"=>121.08604];//进行验证的区域
    validationMap::setCoordArray($map);
    var_dump(validationMap::isCityCenter($array));

在地图中的运用:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例