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


Posted in PHP onOctober 08, 2016

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

以下是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代码

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

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

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

PHP 相关文章推荐
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
php文本转图片自动换行的方法
Mar 13 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
Zend Framework分发器用法示例
Dec 11 PHP
golang 调用 php7详解及实例
Jan 04 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
Mar 08 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
php实现mysql连接池效果实现代码
Jan 25 PHP
PHP实现字符串大小写转函数的功能实例
Feb 06 PHP
PHP基于mcript扩展实现对称加密功能示例
Feb 21 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 #PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
Oct 08 #PHP
php文件类型MIME对照表(比较全)
Oct 07 #PHP
php中文字符串截取多种方法汇总
Oct 06 #PHP
PHP微信红包生成代码分享
Oct 06 #PHP
php下载文件超时时间的设置方法
Oct 06 #PHP
详谈php静态方法及普通方法的区别
Oct 04 #PHP
You might like
PHP脚本的10个技巧(8)
2006/10/09 PHP
几种显示数据的方法的比较
2006/10/09 PHP
再次研究下cache_lite
2007/02/14 PHP
php中用数组的方法设置cookies
2011/04/21 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
让div运动起来 js实现缓动效果
2017/07/06 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python语言描述最大连续子序列和
2017/12/05 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
工商管理实习生自我鉴定范文
2013/12/18 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
安全教育感言
2014/03/04 职场文书
2014年国庆节寄语
2014/09/19 职场文书
师德师风事迹材料
2014/12/20 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL