Home  >  Article  >  Backend Development  >  How to verify whether coordinates are within a certain coordinate area in PHP

How to verify whether coordinates are within a certain coordinate area in PHP

*文
*文Original
2018-01-02 13:58:002685browse

How does PHP verify whether the coordinates are within a certain coordinate area? This article mainly introduces the PHP code to verify coordinates within a certain coordinate area in detail. It has certain reference value. Interested friends can refer to it. I hope to be helpful.

One of the requirements I encountered before was to display the company's services on a map, and to count the user's daily access coordinates to see how many users are within the reachable service radius.

The following is the implementation of the PHP code (only verify that the coordinates are within a certain coordinate area)

<?php
/**
 * 验证坐标点是否在某区域内
 * 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[&#39;lng&#39;], $coordArray[&#39;lat&#39;]);
 }
 /**
  * 比较区域坐标
  * @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[&#39;lng&#39;]>$maxX) $maxX = $item[&#39;lng&#39;];
   if($item[&#39;lng&#39;] < $minX) $minX = $item[&#39;lng&#39;];
   if($item[&#39;lat&#39;]>$maxY) $maxY = $item[&#39;lat&#39;];
   if($item[&#39;lat&#39;] < $minY) $minY = $item[&#39;lat&#39;];
   self::$vertx[] = $item[&#39;lng&#39;];
   self::$verty[] = $item[&#39;lat&#39;];
  }
  if ($pointArray[&#39;lng&#39;] < $minX || $pointArray[&#39;lng&#39;] > $maxX || $pointArray[&#39;lat&#39;] < $minY || $pointArray[&#39;lat&#39;] > $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));

Used in the map:

Related recommendations:

#How to implement process locks and multi-process locks in php Process

How PHP handles MySQL dead connections

How PHP calculates the IP address mask

The above is the detailed content of How to verify whether coordinates are within a certain coordinate area in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn