标签:

项目需求:通过地图坐标和区域坐标点集合 判断当前坐标是否在坐标点集合区域中

$area[array] 区域坐标点集合数组

$area = array(

// 天通苑店

0 => array(

array('x'=>116.38295, 'y'=>40.09416),

array('x'=>116.44037, 'y'=>40.095898),

array('x'=>116.448275,'y'=>40.083313),

array('x'=>116.448455,'y'=>40.050818),

array('x'=>116.448275,'y'=>40.038307),

array('x'=>116.441448,'y'=>40.038418),

array('x'=>116.436058,'y'=>40.038804),

array('x'=>116.417302,'y'=>40.039136),

array('x'=>116.414822,'y'=>40.039384),

array('x'=>116.412738,'y'=>40.039329),

array('x'=>116.407672,'y'=>40.039329),

array('x'=>116.388628,'y'=>40.085162),

array('x'=>116.383633,'y'=>40.084997)

),

//亚运村

1 => array(

array('x'=>116.358804,'y'=>40.028474),

array('x'=>116.41608, 'y'=>40.02875),

array('x'=>116.41723, 'y'=>40.038915),

array('x'=>116.447988,'y'=>40.037921),

array('x'=>116.447844,'y'=>40.026761),

array('x'=>116.455821,'y'=>40.024164),

array('x'=>116.446281,'y'=>39.994736),

array('x'=>116.443532,'y'=>39.995372),

array('x'=>116.376267,'y'=>39.993493),

array('x'=>116.375908,'y'=>40.000015),

array('x'=>116.372027,'y'=>39.999904),

array('x'=>116.371452,'y'=>40.007366),

array('x'=>116.359451,'y'=>40.006758)

),

//望京店

2 => array(

array('x'=>116.46387, 'y'=>40.021125),

array('x'=>116.484495,'y'=>40.020462),

array('x'=>116.515684,'y'=>39.995151),

array('x'=>116.51519, 'y'=>39.976137),

array('x'=>116.491906,'y'=>39.972985),

array('x'=>116.476239,'y'=>39.977298),

array('x'=>116.467472,'y'=>39.96917),

array('x'=>116.443325,'y'=>39.984817),

array('x'=>116.449506,'y'=>39.993109),

array('x'=>116.446357,'y'=>39.994736),

array('x'=>116.456037,'y'=>40.024109)

),

);

---------------------

作者:字符集-utf8

来源:CSDN

原文:https://blog.csdn.net/u014290054/article/details/47418065

版权声明:本文为博主原创文章,转载请附上博文链接!

/**

* 验证坐标点是否在某区域内

* @author xiaoliang <1058436713@qq.com>

* Class validationMap

*/

class InareaAction extends CommonAction {

// 一个表示区域的三维数组

public $config = null;

// 包含每个区域的四边形

public $rectangles = null;

// 每个区域(多边形)的所有边

public $lines = null;

// 要判断的点的x, y坐标

public $_x = null;

public $_y = null;

public function __construct($config){

$this->config = $config;

$this->initRectangles();

$this->initLines();

}

/*

获取包含每个配送区域的四边形

*/

public function initRectangles(){

foreach ($this->config as $k => $v) {

$this->rectangles[$k]['minX'] = $this->getMinXInEachConfig($k);

$this->rectangles[$k]['minY'] = $this->getMinYInEachConfig($k);

$this->rectangles[$k]['maxX'] = $this->getMaxXInEachConfig($k);

$this->rectangles[$k]['maxY'] = $this->getMaxYInEachConfig($k);

}

}

/*

初始化每个区域(多边形)的边(线段:直线的一部分【限制x或者y坐标范围】)

n 个顶点构成的多边形,有 n-1 条边

*/

public function initLines(){

foreach ($this->config as $k => $v) {

$pointNum = count($v);// 区域的顶点个数

$lineNum = $pointNum - 1; // 区域的边条数

for($i=0; $i

// y=kx+b : k

if($this->config[$k][$i]['x'] - $this->config[$k][$i+1]['x'] == 0) $this->lines[$k][$i]['k'] = 0;

else $this->lines[$k][$i]['k'] =

($this->config[$k][$i]['y'] - $this->config[$k][$i+1]['y'])/($this->config[$k][$i]['x'] - $this->config[$k][$i+1]['x']);

// y=kx+b : b

$this->lines[$k][$i]['b'] = $this->config[$k][$i+1]['y'] - $this->lines[$k][$i]['k'] * $this->config[$k][$i+1]['x'];

$this->lines[$k][$i]['lx'] = min($this->config[$k][$i]['x'], $this->config[$k][$i+1]['x']);

$this->lines[$k][$i]['rx'] = max($this->config[$k][$i]['x'], $this->config[$k][$i+1]['x']);

}

$pointNum-=1;

if($this->config[$k][$pointNum]['x'] - $this->config[$k][0]['x'] == 0) $this->lines[$k][$pointNum]['k'] = 0;

else $this->lines[$k][$pointNum]['k'] =

($this->config[$k][$pointNum]['y'] - $this->config[$k][0]['y'])/($this->config[$k][$pointNum]['x'] - $this->config[$k][0]['x']);

// y=kx+b : b

$this->lines[$k][$pointNum]['b'] = $this->config[$k][0]['y'] - $this->lines[$k][$pointNum]['k'] * $this->config[$k][0]['x'];

$this->lines[$k][$pointNum]['lx'] = min($this->config[$k][$pointNum]['x'], $this->config[$k][0]['x']);

$this->lines[$k][$pointNum]['rx'] = max($this->config[$k][$pointNum]['x'], $this->config[$k][0]['x']);

}

}

/*

获取一组坐标中,x坐标最小值

*/

public function getMinXInEachConfig($index){

$minX = 200;

foreach ($this->config[$index] as $k => $v) {

if($v['x'] < $minX){

$minX = $v['x'];

}

}

return $minX;

}

/*

获取一组坐标中,y坐标最小值

*/

public function getMinYInEachConfig($index){

$minY = 200;

foreach ($this->config[$index] as $k => $v) {

if($v['y'] < $minY){

$minY = $v['y'];

}

}

return $minY;

}

/*

获取一组坐标中,x坐标最大值

*/

public function getMaxXInEachConfig($index){

$maxX = 0;

foreach ($this->config[$index] as $k => $v) {

if($v['x'] > $maxX){

$maxX = $v['x'];

}

}

return $maxX;

}

/*

获取一组坐标中,y坐标最大值

*/

public function getMaxYInEachConfig($index){

$maxY = 0;

foreach ($this->config[$index] as $k => $v) {

if($v['y'] > $maxY){

$maxY = $v['y'];

}

}

return $maxY;

}

/*

获取 y=y0 与特定区域的所有边的交点,并去除和顶点重复的,再将交点分为左和右两部分

*/

public function getCrossPointInCertainConfig($index){

$crossPoint = null;

foreach ($this->lines[$index] as $k => $v) {

if($v['k'] == 0) return true;

$x0 = ($this->_y - $v['b']) / $v['k'];// 交点x坐标

if($x0 == $this->_x) return true;// 点在边上

if($x0 > $v['lx'] && $x0 < $v['rx']){

if($x0 < $this->_x) $crossPoint['left'][] = $x0;

if($x0 > $this->_x) $crossPoint['right'][] = $x0;

}

}

return $crossPoint;

}

/*

检测一个点,是否在区域内

返回结果:

return === false : 点不在区域内

return 0, 1, 2, 3 ... 点所在的区域编号(配置文件中的区域编号。)

*/

public function checkPoint($x, $y){

$this->_x = $x;

$this->_y = $y;

$contain = null;

foreach ($this->rectangles as $k => $v) {

if($x > $v['maxX'] || $x < $v['minX'] || $y > $v['maxY'] || $y < $v['minY']){

continue;

}else{

$contain = $k;

break;

}

}

if($contain === null) return false;

$crossPoint = $this->getCrossPointInCertainConfig($contain);

if($crossPoint === true) return $contain;

if(count($crossPoint['left'])%2 == 1 && count($crossPoint['right'])%2 == 1) return $contain;

return false;

}

}

//实例化对象

$area = new Area($area);

//判断坐标点是否在区域中 如果坐标点在某一区域返回区域编号 否则返回false;

var_dump($area->checkPoint(116.531748,39.944229))

标签:

来源: https://www.cnblogs.com/objects/p/9822385.html

php 随机坐标点,php实现 计算坐标点在某区域相关推荐

  1. MATLAB随机生成m个三维坐标点,且各个坐标点之间的距离不小于n

    randi函数 randi(max,m,n); %生成均匀分布的随机整数,max生成的随机整数最大值,生成m行n列的矩阵 编写函数sampling function [x,y,z]=sampling( ...

  2. numpy.random.randint()函数生成随机坐标点

    numpy.random.randint()函数不仅可以生成一维随机数组,也可以生成多维度的随机数组,这里以生成二维随机数组坐标点举例. 设定np.random.seed(40)来保持随机产生数组的可 ...

  3. 使用 .NET 标记游戏地图关键坐标点

    本文以天涯明月刀 OL 游戏的云上之城探索玩法为例,介绍如何使用 .NET 在游戏地图中标记大量关键坐标点. 1. 背景 大概很多程序员都是喜欢玩游戏的吧,我也不例外.我们经常会看到电视剧中的各路游戏 ...

  4. 练习题记录:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离

    碰到一道练习题:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离.我一开始看到这题目是一脸懵逼,然后上网找了一下,更是二脸懵逼.生成一百个二维坐标点,我首先就是想去生成一个1010的二 ...

  5. EXCEL中批量计算“已知一点坐标、方位角、距离,求坐标点”

    前言 日常工作中有时需要计算已知点.正本方位角.距离计算坐标点.如下图 已知:蓝点坐标.正本方向夹角为方位角,蓝点与未知点(红色)之间的距离,求红色点坐标. 小O地图Excel插件版提供在excel表 ...

  6. Cesium坐标转换:根据两个坐标点(坐标点a、坐标点b)的经纬度,计算a点和b点的角度

    计算a点和b点的角度(偏行角:逆时针)  /*** 计算a点和b点的角度(偏行角)* @param lng_a a点经度* @param lat_a a点维度* @param lng_b b点经度* ...

  7. c++求两点的距离利用友元_用c++定义两个坐标点,计算两点间距离;进而计算线段的面积...

    //本程序有三个层次 //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance ...

  8. CAD坐标点、经纬度坐标点转ARCGIS矢量,求重叠面积

    因工作需要尝试了很多次,记录一下,有缘帮助到大家的话,很开心.(如提供某工业区坐标点;求其与已有矢量的重叠面积) CAD格式的点数据: 通常可能CAD数据是没有加带号偏移的(例如:570058.6 3 ...

  9. 在一个圆内随机取若个坐标点(python)

    在一个指定位置的圆内随机取若干个坐标点,num为数量,radius为圆的半径,(centerx, centery)为圆心坐标. 方法一:根据条件判断的随机点产生方法 import random imp ...

  10. 用c++定义两个坐标点,计算两点间距离;进而计算线段的面积

    //本程序有三个层次 //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance ...

最新文章

  1. yii2嵌入微信公众号支付
  2. Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc
  3. numpy.core.umath failed to import 如何解决
  4. mysql过滤效率和java过滤效率_如何合理选择初中高效过滤器的效率?
  5. CSS3边框图片、边框阴影、文本阴影
  6. artTemplate模板引擎的源码拜读
  7. pytorch 中 torch.cat 函数的使用
  8. worldwind java 教程_科学网—用worldwind java SDK开发应用程序 - 谢安涛的博文
  9. 无线射频识别技术开发与应用学习视频
  10. 推荐一款在线工具-程序员的工具箱
  11. 求公共子树(后缀树法)
  12. 使php爬虫能够长期运行的一点总结
  13. TCP和UDP对比的优势和劣势
  14. 三国志战略版:先锋斥候广州行
  15. 银河麒麟操作系统常用问题及解决方法
  16. 16.火焰传感器实验
  17. 日常生活收缩毛孔几个小妙招 - 生活至上,美容至尚!
  18. 转: Windows句柄数的限制
  19. python中多重if语句用法_python-循环语句的简单条件语句、多重条件语句和嵌套条件语句编写...
  20. 配置PHP运行环境的方法步骤

热门文章

  1. 三言两语说清“线性流程”
  2. LightOJ - 1050 (唯一分解+推公式+乘法逆元)
  3. The content of the adapter has changed but ListView did not receive a notification
  4. 【转载】 扫描二维码自动识别手机APP下载地址
  5. Struts2 注解
  6. 跨平台移动应用开发框架AppCan2.0开发经验分享
  7. iphone开发常用编码
  8. HAPPY 2010
  9. Portable SharpDevelop(PSD):便携的DotNet集成开发环境
  10. python获取某个模块文件的路径