php验证地图坐标在某片坐标区域内
mysql空间查询并不太适合地图坐标,如果使用:http://www.cnblogs.com/tyjsjl/p/8760002.html的方式进行地图点坐标的查询就不好用了,于是直接使用php来进行地图范围的查询更方便点。代码如下:
/**
* 验证坐标点是否在某区域内
* @author xiaoliang <1058436713@qq.com>
* Class validationMap
*/
class validationMap{
private $coordArray;
private $vertx = [];
private $verty = [];
/**
* 设置坐标区域
* @param mixed $coordArray
*/
public function setCoordArray(array $coordArray)
{
$this->coordArray = $coordArray;
}
/**
* 验证区域范围
* @param array $coordArray
* @return bool
*/
public function isCityCenter(array $coordArray){
if(!$this->vaildatePoint($coordArray)){
return false;
}
return $this->pnpoly(count($this->coordArray), $coordArray['lng'], $coordArray['lat']);
}
/**
* 比较区域坐标
* @param $nvert
* @param $testx
* @param $testy
* @return bool
*/
private function pnpoly($nvert,$testx, $testy)
{
$c = false;
for ($i = 0, $j = $nvert-1; $i < $nvert; $j = $i++) {
if ( ( ($this->verty[$i]>$testy) != ($this->verty[$j]>$testy) ) && ($testx < ($this->vertx[$j]-$this->vertx[$i]) * ($testy-$this->verty[$i]) / ($this->verty[$j]-$this->verty[$i]) + $this->vertx[$i]) )
$c = !$c;
}
return $c;
}
/**
* 验证坐标
* @param array $pointArray
* @return bool
*/
private function vaildatePoint(array $pointArray){
$maxY = $maxX = 0;
$minY = $minX = 9999;
foreach ($this->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'];
$this->vertx[] = $item['lng'];
$this->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));
因为每个区域的地图点坐标需要从数据库提取进行查询,所以静态类就不太方便了,本文代码不使用静态类。关于静态类的优缺点在此不作说明。
原文代码:https://www.cnblogs.com/liang94/p/5936583.html
php验证地图坐标在某片坐标区域内的更多相关文章
- 验证坐标在某片坐标区域内 php 代码
		
之前碰到的这样一个需求,要将公司的服务范围在地图中显示出来,并将用户每天的访问坐标进行统计看有多少用户是在所能达到的服务范围半径内. 以下是PHP代码的实现 (仅验证坐标在某片坐标区域内) <? ...
 - 利用百度地图API,获取经纬度坐标
		
利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代 ...
 - PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例
		
原文:PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例 <!--小幅的坐标转换点位程序--> <!DOCTYPE html> <html&g ...
 - C# 计算地图上某个坐标点的是否在多边形内
		
这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143 使用百度地图的时候,常常会用到判断一个点是否在一个多边形的范围内,该方法用到的是射线法, 通过修改Java ...
 - IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息
		
IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocati ...
 - 百度地图API 地图圈区域并计算坐标点是否在区域内
		
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版
		
火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...
 - WGS84、GCJ-02(火星坐标)、百度坐标,Web墨卡托坐标
		
GCJ-02坐标系统(火星坐标)简介:http://blog.csdn.net/giswens/article/details/8775121(存档:http://mapbd.com/cms/2012 ...
 - BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换
		
BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换 http://www.cnphp6.com/archives/24822 by root ⋅ Leave a ...
 
随机推荐
- CentOS 6 RPM安装包下载地址
			
32位系统的RPM安装包的下载地址 http://mirrors.163.com/centos/6/os/i386/Packages/ 64位系统的RPM安装包的下载地址 http://mirrors ...
 - MySQL中查询、删除重复记录的方法大全
			
查找所有重复标题的记录: select title,count(*) as count from user_table group by title having count>1; SELECT ...
 - 使用jquey 须掌握的常见知识点
			
1.jquery获取标签.class.id.input的值 $("div") $(".active") $("#login") ...
 - 面试中linux常见的20个命令
			
1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. 2.查看一个程序是否运行 ps –ef|grep tomcat 查看所有有关to ...
 - CentOS 7 环境下GitLab安装及基本配置
			
新实验室要求重新建设GitLab,对于我来讲,是第一次有机会当元老参与实验室的建设.下面分享我自己的实测经验: 1. 安装依赖软件并设置开机启动 yum install curlpolicycoreu ...
 - 大数据学习-2 认识Hadoop
			
一.什么是Hadoop? Hadoop可以简单的理解为一个数据存储和数据分析分布式系统.随着互联网的普及产生的数据是非常的庞大的,那么我们怎么去处理这么大量的数据呢?传统的单一计算机肯定是完成不了的, ...
 - vue修改框架样式/deep/
			
/deep/ 父元素的样式名 /deep/ 要修改的样式名 使用 ... 貌似不行
 - less--入门
			
Less(Learner Style Sheets)是向后兼容css扩展语言. 变量(Variables) @width: 10px; @height: @width + 10px; header{ ...
 - C++实验四
			
// 类graph的实现 #include "graph.h" #include <iostream> using namespace std; // 带参数的构造函数 ...
 - js判断页面在pc端打开还是移动端打开
			
js判断页面在pc端打开还是移动端打开,分别跳转不同的index.html window.addEventListener('load', function() { // true为手机,false为 ...