php 随机坐标点,php实现 计算坐标点在某区域
标签:
项目需求:通过地图坐标和区域坐标点集合 判断当前坐标是否在坐标点集合区域中
$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实现 计算坐标点在某区域相关推荐
- MATLAB随机生成m个三维坐标点,且各个坐标点之间的距离不小于n
randi函数 randi(max,m,n); %生成均匀分布的随机整数,max生成的随机整数最大值,生成m行n列的矩阵 编写函数sampling function [x,y,z]=sampling( ...
- numpy.random.randint()函数生成随机坐标点
numpy.random.randint()函数不仅可以生成一维随机数组,也可以生成多维度的随机数组,这里以生成二维随机数组坐标点举例. 设定np.random.seed(40)来保持随机产生数组的可 ...
- 使用 .NET 标记游戏地图关键坐标点
本文以天涯明月刀 OL 游戏的云上之城探索玩法为例,介绍如何使用 .NET 在游戏地图中标记大量关键坐标点. 1. 背景 大概很多程序员都是喜欢玩游戏的吧,我也不例外.我们经常会看到电视剧中的各路游戏 ...
- 练习题记录:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离
碰到一道练习题:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离.我一开始看到这题目是一脸懵逼,然后上网找了一下,更是二脸懵逼.生成一百个二维坐标点,我首先就是想去生成一个1010的二 ...
- EXCEL中批量计算“已知一点坐标、方位角、距离,求坐标点”
前言 日常工作中有时需要计算已知点.正本方位角.距离计算坐标点.如下图 已知:蓝点坐标.正本方向夹角为方位角,蓝点与未知点(红色)之间的距离,求红色点坐标. 小O地图Excel插件版提供在excel表 ...
- Cesium坐标转换:根据两个坐标点(坐标点a、坐标点b)的经纬度,计算a点和b点的角度
计算a点和b点的角度(偏行角:逆时针) /*** 计算a点和b点的角度(偏行角)* @param lng_a a点经度* @param lat_a a点维度* @param lng_b b点经度* ...
- c++求两点的距离利用友元_用c++定义两个坐标点,计算两点间距离;进而计算线段的面积...
//本程序有三个层次 //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance ...
- CAD坐标点、经纬度坐标点转ARCGIS矢量,求重叠面积
因工作需要尝试了很多次,记录一下,有缘帮助到大家的话,很开心.(如提供某工业区坐标点;求其与已有矢量的重叠面积) CAD格式的点数据: 通常可能CAD数据是没有加带号偏移的(例如:570058.6 3 ...
- 在一个圆内随机取若个坐标点(python)
在一个指定位置的圆内随机取若干个坐标点,num为数量,radius为圆的半径,(centerx, centery)为圆心坐标. 方法一:根据条件判断的随机点产生方法 import random imp ...
- 用c++定义两个坐标点,计算两点间距离;进而计算线段的面积
//本程序有三个层次 //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance ...
最新文章
- yii2嵌入微信公众号支付
- Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc
- numpy.core.umath failed to import 如何解决
- mysql过滤效率和java过滤效率_如何合理选择初中高效过滤器的效率?
- CSS3边框图片、边框阴影、文本阴影
- artTemplate模板引擎的源码拜读
- pytorch 中 torch.cat 函数的使用
- worldwind java 教程_科学网—用worldwind java SDK开发应用程序 - 谢安涛的博文
- 无线射频识别技术开发与应用学习视频
- 推荐一款在线工具-程序员的工具箱
- 求公共子树(后缀树法)
- 使php爬虫能够长期运行的一点总结
- TCP和UDP对比的优势和劣势
- 三国志战略版:先锋斥候广州行
- 银河麒麟操作系统常用问题及解决方法
- 16.火焰传感器实验
- 日常生活收缩毛孔几个小妙招 - 生活至上,美容至尚!
- 转: Windows句柄数的限制
- python中多重if语句用法_python-循环语句的简单条件语句、多重条件语句和嵌套条件语句编写...
- 配置PHP运行环境的方法步骤
热门文章
- 三言两语说清“线性流程”
- LightOJ - 1050 (唯一分解+推公式+乘法逆元)
- The content of the adapter has changed but ListView did not receive a notification
- 【转载】 扫描二维码自动识别手机APP下载地址
- Struts2 注解
- 跨平台移动应用开发框架AppCan2.0开发经验分享
- iphone开发常用编码
- HAPPY 2010
- Portable SharpDevelop(PSD):便携的DotNet集成开发环境
- python获取某个模块文件的路径