溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用php驗證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)

發(fā)布時間:2021-09-01 13:56:26 來源:億速云 閱讀:125 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“如何使用php驗證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用php驗證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)”這篇文章吧。

之前碰到的這樣一個需求,要將公司的服務(wù)在地圖中顯示出來,并將用戶每天的訪問坐標(biāo)進行統(tǒng)計看有多少用戶是在所能達(dá)到的服務(wù)范圍半徑內(nèi)。

以下是PHP代碼的實現(xiàn) (僅驗證坐標(biāo)在某片坐標(biāo)區(qū)域內(nèi))

<?php
/**
 * 驗證坐標(biāo)點是否在某區(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;
 }
 /**
  * 驗證區(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;
 }
 /**
  * 驗證坐標(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];//進行驗證的區(qū)域
validationMap::setCoordArray($map);
var_dump(validationMap::isCityCenter($array));

在地圖中的運用:

如何使用php驗證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)

如何使用php驗證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)

如何使用php驗證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)

以上是“如何使用php驗證坐標(biāo)在某坐標(biāo)區(qū)域內(nèi)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI