驗(yàn)證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)php代碼
之前碰到的這樣一個(gè)需求,要將公司的服務(wù)在地圖中顯示出來,并將用戶每天的訪問坐標(biāo)進(jìn)行統(tǒng)計(jì)看有多少用戶是在所能達(dá)到的服務(wù)范圍半徑內(nèi)。
以下是PHP代碼的實(shí)現(xiàn) (僅驗(yàn)證坐標(biāo)在某片坐標(biāo)區(qū)域內(nèi))
<?php
/**
* 驗(yàn)證坐標(biāo)點(diǎn)是否在某區(qū)域內(nèi)
* @author xiaoliang <1058436713@qq.com>
* Class validationMap
*/
class validationMap{
private static $coordArray;
private static $vertx = [];
private static $verty = [];
/**
* 設(shè)置坐標(biāo)區(qū)域
* @param mixed $coordArray
*/
public static function setCoordArray(array $coordArray)
{
self::$coordArray = $coordArray;
}
/**
* 驗(yàn)證區(qū)域范圍
* @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']);
}
/**
* 比較區(qū)域坐標(biāo)
* @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;
}
/**
* 驗(yàn)證坐標(biāo)
* @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];//進(jìn)行驗(yàn)證的區(qū)域
validationMap::setCoordArray($map);
var_dump(validationMap::isCityCenter($array));
在地圖中的運(yùn)用:



以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺析is_writable的php實(shí)現(xiàn)
- PHP與Go語言之間的通信詳解
- ThinkPHP的SAE開發(fā)相關(guān)注意事項(xiàng)詳解
- Ubuntu 14.04 安裝 MongoDB 及 PHP MongoDB Driver詳細(xì)介紹
- PHP 實(shí)現(xiàn)等比壓縮圖片尺寸和大小實(shí)例代碼
- php獲取服務(wù)器操作系統(tǒng)相關(guān)信息的方法
- php獲取遠(yuǎn)程圖片并下載保存到本地的方法分析
- CentOS 7.0編譯安裝lnmp教程(Nginx1.6.0+MySQL5.6.19+PHP5.5.14)
- CentOS 6.6服務(wù)器編譯安裝lnmp(Nginx1.6.2+MySQL5.6.21+PHP5.6.3)
- CentOS 7.0服務(wù)器安裝配置LAMP服務(wù)器(Apache+PHP+MariaDB)
- php is_writable判斷文件是否可寫實(shí)例代碼
相關(guān)文章
php統(tǒng)計(jì)數(shù)組不同元素的個(gè)數(shù)的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于php統(tǒng)計(jì)數(shù)組不同元素的個(gè)數(shù)的實(shí)例方法以及相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。2019-09-09
PHP版微信第三方實(shí)現(xiàn)一鍵登錄及獲取用戶信息的方法
這篇文章主要介紹了PHP版微信第三方實(shí)現(xiàn)一鍵登錄及獲取用戶信息的方法,較為詳細(xì)的分析了微信第三方登陸的相關(guān)注意事項(xiàng)與實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-10-10
php驗(yàn)證郵箱和ip地址最簡(jiǎn)單方法匯總
這篇文章為大家分享了php驗(yàn)證郵箱和ip地址最簡(jiǎn)單的方法,,需要的朋友可以參考下2015-10-10
php通過數(shù)組實(shí)現(xiàn)多條件查詢實(shí)現(xiàn)方法(字符串分割)
這篇文章主要介紹了php通過數(shù)組實(shí)現(xiàn)多條件查詢實(shí)現(xiàn)方法(字符串分割),需要的朋友可以參考下2014-05-05
PHP中實(shí)現(xiàn)中文字符進(jìn)制轉(zhuǎn)換原理分析
中文字符編碼研究系列第四期,PHP實(shí)現(xiàn)中文字符進(jìn)制轉(zhuǎn)換原理分析,主要討論中文漢字轉(zhuǎn)換為十進(jìn)制和十六進(jìn)制的方法,并掌握轉(zhuǎn)換原理應(yīng)用于實(shí)際開發(fā)。本文以GBK編碼字符為例,討論GBK編碼的字符轉(zhuǎn)換原理2011-12-12

