PHP 将百度地图上的一条线的点位进行平滑处理,画出一条曲线
/**
*将一条地图上的线平滑
*@param originPoint:点位数组
*@method POST
*@return aray curvePoint
*/
public function createCurve($originPoint){
$curvePoint = []; //返回的数组
//$originPoint = [['LON'=>116.394855,'LAT'=>39.987338],['LON'=>116.419145,'LAT'=>39.998835],['LON'=>116.444154,'LAT'=>39.996348],['LON'=>116.462407,'LAT'=>39.981146]];
$originCount = count($originPoint);
$scale = 0.4; //平滑系数
$midpoints = []; //创建一个长度是$originCount的空数组$midpoints
for ($i=0; $i < $originCount; $i++) {
$midpoints[$i] = [];
}
//生成中点
for($i = 0 ;$i < $originCount ; $i++){
$nexti = ($i + 1) % $originCount;
$midpoints[$i]['LON'] = ($originPoint[$i]['LON'] + $originPoint[$nexti]['LON'])/2.0;
$midpoints[$i]['LAT'] = ($originPoint[$i]['LAT'] + $originPoint[$nexti]['LAT'])/2.0;
}
//var_dump($midpoints);die;
//平移中点
$extrapoints = []; //创建一个2 * originCount的空数组$extrapoints
//for ($i=0; $i < 2; $i++) {
/*for ($j=0; $j < $originCount; $j++) {
$extrapoints[$j] = ['LON'=>'','LAT'=>''];
}*/
//}
for($i = 0 ;$i < $originCount ; $i++){
$nexti = ($i + 1) % $originCount;
$backi = ($i + $originCount - 1) % $originCount;
$midinmid = [];
$midinmid['LON'] = ($midpoints[$i]['LON'] + $midpoints[$backi]['LON'])/2.0;
$midinmid['LAT'] = ($midpoints[$i]['LAT'] + $midpoints[$backi]['LAT'])/2.0;
$offsetx = $originPoint[$i]['LON'] - $midinmid['LON'];
$offsety = $originPoint[$i]['LAT'] - $midinmid['LAT'];
/*var_dump($originPoint[$i]['LON']);
echo $scale;echo "<br />";
var_dump($midinmid['LON']);echo "<br />";*/
$extraindex = 2 * $i;
$extrapoints[$extraindex]['LON'] = $midpoints[$backi]['LON'] + $offsetx;
$extrapoints[$extraindex]['LAT'] = $midpoints[$backi]['LAT'] + $offsety;
//朝 originPoint[i]方向收缩
$addx = ($extrapoints[$extraindex]['LON'] - $originPoint[$i]['LON']) * $scale;
$addy = ($extrapoints[$extraindex]['LAT'] - $originPoint[$i]['LAT']) * $scale;
$extrapoints[$extraindex]['LON'] = $originPoint[$i]['LON'] + $addx;
$extrapoints[$extraindex]['LAT'] = $originPoint[$i]['LAT'] + $addy;
/*var_dump($extrapoints[$extraindex]['LON']);
echo $scale;echo "<br />";
var_dump($originPoint[$i]['LON']);echo "<br />";*/
$extranexti = ($extraindex + 1)%(2 * $originCount);
$extrapoints[$extranexti]['LON'] = $midpoints[$i]['LON'] + $offsetx;
$extrapoints[$extranexti]['LAT'] = $midpoints[$i]['LAT'] + $offsety;
//朝 originPoint[i]方向收缩
$addx = ($extrapoints[$extranexti]['LON'] - $originPoint[$i]['LON']) * $scale;
$addy = ($extrapoints[$extranexti]['LAT'] - $originPoint[$i]['LAT']) * $scale;
$extrapoints[$extranexti]['LON'] = $originPoint[$i]['LON'] + $addx;
$extrapoints[$extranexti]['LAT'] = $originPoint[$i]['LAT'] + $addy;
}
$controlPoint = []; //创建一个长度是4的数组$controlPoint
for ($i=0; $i < 4; $i++) {
$controlPoint[$i] = [];
}
//生成4控制点,产生贝塞尔曲线
for($i = 0 ;$i < $originCount ; $i++){
$controlPoint[0] = $originPoint[$i];
$extraindex = 2 * $i;
$controlPoint[1] = $extrapoints[$extraindex + 1];
$extranexti = ($extraindex + 2) % (2 * $originCount);
$controlPoint[2] = $extrapoints[$extranexti];
$nexti = ($i + 1) % $originCount;
$controlPoint[3] = $originPoint[$nexti];
$u = 1;
while($u >= 0){
$px = $this->bezier3funcX($u,$controlPoint);
$py = $this->bezier3funcY($u,$controlPoint);
//u的步长决定曲线的疏密
$u -= 0.05;
$tempP = ['LON'=>$px,'LAT'=>$py];
//存入曲线点
$curvePoint[] = $tempP;
}
}
//var_dump($curvePoint);
foreach ($curvePoint as $key => $value) {
if($key>(count($curvePoint)-31)){
unset($curvePoint[$key]);
}
}
//var_dump($curvePoint);die;
foreach ($curvePoint as $key => $value) {
if( $key>0 && $key<10 ){
unset($curvePoint[$key]);
}
}
$curvePoint[] = $originPoint[count($originPoint)-1];
$curvePoint = array_values($curvePoint);
//var_dump($curvePoint);
/*$str = '';
foreach ($curvePoint as $key => $value) {
// $str .= '['.$value['LON'].','.$value['LAT'].'],';
$str .= 'new BMap.Point('.$value['LON'].', '.$value['LAT'].'),';
}
$str = rtrim($str,',');
echo $str;*/
return $curvePoint;
}
//三次贝塞尔曲线
private function bezier3funcX($uu,$controlP){
$part0 = $controlP[0]['LON'] * $uu * $uu * $uu;
$part1 = 3 * $controlP[1]['LON'] * $uu * $uu * (1 - $uu);
$part2 = 3 * $controlP[2]['LON'] * $uu * (1 - $uu) * (1 - $uu);
$part3 = $controlP[3]['LON'] * (1 - $uu) * (1 - $uu) * (1 - $uu);
return $part0 + $part1 + $part2 + $part3;
}
private function bezier3funcY($uu,$controlP){
$part0 = $controlP[0]['LAT'] * $uu * $uu * $uu;
$part1 = 3 * $controlP[1]['LAT'] * $uu * $uu * (1 - $uu);
$part2 = 3 * $controlP[2]['LAT'] * $uu * (1 - $uu) * (1 - $uu);
$part3 = $controlP[3]['LAT'] * (1 - $uu) * (1 - $uu) * (1 - $uu);
return $part0 + $part1 + $part2 + $part3;
}
PHP 将百度地图上的一条线的点位进行平滑处理,画出一条曲线相关推荐
- Python采集全国各地百度地图上店铺POI数据(母婴、美食等)
Python采集全国各地百度地图上店铺POI数据 1. 注册百度地图开放平台账号 先注册百度地图开发平台账号,创建应用,获得AK 2. 通过Python批量检索不同城市店铺POI数据 2.1 大致思路 ...
- android百度地图轨迹实现,android 获取GPS经纬度在百度地图上绘制轨迹
实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /** * 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标 ...
- 03 在百度地图上定位到指定位置
O 需求 将指定经纬度,显示在百度地图上. 一 准备 详见<01 如何将百度地图加入IOS应用程序?> 二 编码 (New标示本次新添加的代码:Delete表示本次需要删除的代码:Modi ...
- navigator.geolocation的应用 - 将定位信息显示在百度地图上
在学习navigator.geolocation的时候,有一个实例是获取坐标后显示在谷歌地图上.众所周知,谷歌地图国内并不能直接访问,得用特殊手段,那我要测试的时候还要开着梯子挺麻烦的,想给别人用也得 ...
- python百度地图标注自己的店名_百度地图上怎么显示店名 百度地图标注店名方法...
对于很多经营小店的小伙伴来说,能让人一打开百度地图就能看到自己的店名显示在其中便觉得这是一件颇为高兴的事情,但问题是如何在百度地图上怎么显示自己的店名呢?下面小编就为大家带来百度地图标注店名方法,希望 ...
- 在百度地图上展示dwg/dxf
1.目标 将autocad道路工程图纸展示在百度地图上. 案例:https://www.synscen.com/dxf2map 2.步骤 2.1 dwg转dxf 使用oda转换工具(https://w ...
- html5获取我的位置并在百度地图上显示
html5获取我的位置并在百度地图上显示 一.前言 二.在线演示和GitHub源码 一.前言 最近有兴趣研究了下移动端的地图api,发现其实挺简单的,HTML5也提供了地理位置API:Geolocat ...
- 如何将小车标注在百度地图上并且设置车头方向
如何将小车标注在百度地图上并且设置车头方向 首先,需要在项目中引入百度地图的API 第二步,将百度地图嵌入到项目中 第三步,将小车标注在地图中 第四步,设置车头的方向 <html lang=&q ...
- 怎么在百度地图上标注公司地址
从某种意义上来讲,现在的地图推广是非常重要的,百度地图,就相当于以百度的名义来为自己量身定做一种随时查阅的电子名片.这是非常不错的一种方法,通过这样的方式能够在第一时间快速的完成推广,能够让用户更加轻 ...
- 根据经纬度坐标值在百度地图上绘制轨迹
因为项目需要做物体轨迹检测,所以要把物体移动的轨迹在百度地图上进行绘制和显示,于是就在网上找到了这个方法,现在做个记录方便以后查阅: 1.html 部分设置存放地图的容器和设置你的百度地图的ak ht ...
最新文章
- arduino小车前进代码_基于Arduino操纵杆扩展板Funduino制作机器人小车
- LaunchScreen.xib 设置启动图
- react 组件与组件之间通讯
- 开源的负载测试/压力测试工具 NBomber
- Ajax响应处理数据的三种格式(主要使用gson包)
- or函数 java_Java OptionalInt orElseGet()用法及代码示例
- 易买网HTML静态页面,易买网(前台+后台的静态页面)
- cube station下载_Cube Station
- 一道面试题及其扩展,求好解法
- android mainactivity 刷新fragment,Android刷新从FragmentActivity android.support.v4.app.Fragment
- python线程池回调函数_python回调函数中使用多线程的方法
- 3d打印机c语言程序下载,C语言下载
- SpringMvc生成Excel和PDF
- linux 在固定网址yum,linux yum介绍
- 微信小程序开始时间,结束时间
- 强化学习:不用给AI一个支点,他也能想办法撬起地球
- 星际无限高级合伙人培训大会在深圳南山举行
- form提交的几种方法
- 0xc000007b 问题总结
- 好书整理(to be continued)