验证坐标在某坐标区域内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 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
Ajax PHP分页演示
Jan 02 PHP
PHP Pear 安装及使用
Mar 19 PHP
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
php中的观察者模式
Mar 24 PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 PHP
php实现比较全的数据库操作类
Jun 18 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
详解php命令注入攻击
Apr 06 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
May 27 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 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
图形数字验证代码
2006/10/09 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
jscript之List Excel Color Values
2007/06/13 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
javascript数组去重小结
2016/03/07 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
python文件和文件夹复制函数
2020/02/07 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
python中pyqtgraph知识点总结
2021/01/26 Python
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
使用索引有什么好处
2016/07/27 面试题
通信工程专业女生个人求职信
2013/09/21 职场文书
装潢设计专业推荐信模板
2013/11/26 职场文书
保险专业求职信
2014/07/07 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript