驗證坐標在某坐標區(qū)域內(nèi)php代碼
更新時間:2016年10月08日 09:58:23 作者:x_liang
這篇文章主要為大家詳細介紹了驗證坐標在某片坐標區(qū)域內(nèi)php代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
之前碰到的這樣一個需求,要將公司的服務在地圖中顯示出來,并將用戶每天的訪問坐標進行統(tǒng)計看有多少用戶是在所能達到的服務范圍半徑內(nèi)。
以下是PHP代碼的實現(xiàn) (僅驗證坐標在某片坐標區(qū)域內(nèi))
<?php
/**
* 驗證坐標點是否在某區(qū)域內(nèi)
* @author xiaoliang <1058436713@qq.com>
* Class validationMap
*/
class validationMap{
private static $coordArray;
private static $vertx = [];
private static $verty = [];
/**
* 設置坐標區(qū)域
* @param mixed $coordArray
*/
public static function setCoordArray(array $coordArray)
{
self::$coordArray = $coordArray;
}
/**
* 驗證區(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ū)域坐標
* @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];//進行驗證的區(qū)域
validationMap::setCoordArray($map);
var_dump(validationMap::isCityCenter($array));
在地圖中的運用:



以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- 淺析is_writable的php實現(xiàn)
- PHP與Go語言之間的通信詳解
- ThinkPHP的SAE開發(fā)相關注意事項詳解
- Ubuntu 14.04 安裝 MongoDB 及 PHP MongoDB Driver詳細介紹
- PHP 實現(xiàn)等比壓縮圖片尺寸和大小實例代碼
- php獲取服務器操作系統(tǒng)相關信息的方法
- php獲取遠程圖片并下載保存到本地的方法分析
- CentOS 7.0編譯安裝lnmp教程(Nginx1.6.0+MySQL5.6.19+PHP5.5.14)
- CentOS 6.6服務器編譯安裝lnmp(Nginx1.6.2+MySQL5.6.21+PHP5.6.3)
- CentOS 7.0服務器安裝配置LAMP服務器(Apache+PHP+MariaDB)
- php is_writable判斷文件是否可寫實例代碼
相關文章
php統(tǒng)計數(shù)組不同元素的個數(shù)的實例方法
在本篇文章里小編給大家整理的是關于php統(tǒng)計數(shù)組不同元素的個數(shù)的實例方法以及相關知識點,有需要的朋友們學習下。2019-09-09
PHP版微信第三方實現(xiàn)一鍵登錄及獲取用戶信息的方法
這篇文章主要介紹了PHP版微信第三方實現(xiàn)一鍵登錄及獲取用戶信息的方法,較為詳細的分析了微信第三方登陸的相關注意事項與實現(xiàn)技巧,需要的朋友可以參考下2016-10-10
php通過數(shù)組實現(xiàn)多條件查詢實現(xiàn)方法(字符串分割)
這篇文章主要介紹了php通過數(shù)組實現(xiàn)多條件查詢實現(xiàn)方法(字符串分割),需要的朋友可以參考下2014-05-05

