驗證座標在某片座標地區內 php 代碼

來源:互聯網
上載者:User

標籤:

之前碰到的這樣一個需求,要將公司的服務在地圖中顯示出來,並將使用者每天的訪問座標進行統計看有多少使用者是在所能達到的服務涵蓋範圍半徑內。

以下是PHP代碼的實現 (僅驗證座標在某片座標地區內)

<?php/** * 驗證座標點是否在某地區內 * @author xiaoliang <[email protected]> * 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[‘lng‘], $coordArray[‘lat‘]);    }    /**     * 比較地區座標     * @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];//進行驗證的地區validationMap::setCoordArray($map);var_dump(validationMap::isCityCenter($array));

在地圖中的運用:

驗證座標在某片座標地區內 php 代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.