滴滴热力图-php版(后面有js版本)

yanggege      2022-02-11     133

关键词:

/**
* 获取边界
* @return mixed
* @return false|string
* @throws Exception
*/
public function actionBorder()
{
$lock_file = "/tmp/process.lock";
$lock_file_handle = fopen($lock_file, ‘w‘);
if ($lock_file_handle === false)
die("Can not create lock file {$lock_file} ");
if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) {
die(date("Y-m-d H:i:s") . " Process already exists. ");
}

$cache = Yii::$app->cache;
// $cache->delete(‘amap_border‘);

$result = $cache->get(‘amap_border‘);
if($result) {
// return json_encode($result);
}

$gaode_url = ‘https://restapi.amap.com/v3/config/district?keywords=110100&subdistrict=0&extensions=all&key=****‘;
$curl = new HttpCurl();
$response_json = $curl->get($gaode_url);
$response_arr = json_decode($response_json, true);
$left_lng = 0;
$up_lat = 0;
$right_lng = 0;
$down_lat = 0;
$lng_lat_arr = [];
$lng_lat_tmp_arr = [];
$result_arr_list = [];
if($response_arr[‘status‘] == 1){
$lng_lat_str = isset($response_arr[‘districts‘][0][‘polyline‘]) ? $response_arr[‘districts‘][0][‘polyline‘] : ‘‘;
$lng_lat_tmp_list = explode(‘|‘, $lng_lat_str);
$i = 1;
foreach ($lng_lat_tmp_list as $k=>$lng_lat_tmp){
$lng_lat_arr_tmp = explode(‘;‘, $lng_lat_tmp);
foreach ($lng_lat_arr_tmp as $lng_lat_arr_v) {
// 17152
if(!($i % 10)) {
$lng_lat_t_arr = explode(‘,‘, $lng_lat_arr_v);
$result_tmp[‘lng‘] = $lng_lat_t_arr[0];
$result_tmp[‘lat‘] = $lng_lat_t_arr[1];
$result_arr_list[$k][] = $result_tmp;
$lng_lat_arr[$k][] = $lng_lat_t_arr;
$lng_lat_tmp_arr[] = $lng_lat_t_arr;
}
$i++;
}
}
// var_dump(count($lng_lat_tmp_arr));die;

$tmp_lng_arr = ArrayHelper::getColumn($lng_lat_tmp_arr, ‘0‘);
$tmp_lat_arr = ArrayHelper::getColumn($lng_lat_tmp_arr, ‘1‘);
$left_lng =min($tmp_lng_arr);
$up_lat =max($tmp_lat_arr);
$right_lng =max($tmp_lng_arr);
$down_lat =min($tmp_lat_arr);
}
$boundary_arr = [];
foreach ($result_arr_list as $result_arr) {
// 获取6个点
$boundary_arr = $this->draw_other_lng_lat($left_lng, $up_lat, $result_arr, $right_lng, $down_lat);
$boundary_arr = array_merge($boundary_arr,$boundary_arr);
}

$result = [
‘code‘ => 0,
// ‘msg‘=>‘‘,
‘data‘ => $lng_lat_arr,
‘boundary_arr‘ => $boundary_arr,
‘left_lng‘=>$left_lng,
‘up_lat‘=>$up_lat,
‘right_lng‘=>$right_lng,
‘down_lat‘=>$down_lat,
];
$cache->set(‘amap_border‘, $result);
var_dump(count($boundary_arr));die;

}

public function draw_other_lng_lat($longitude, $latitude, $result_list, $right_lng, $down_lat) {
$latDistance = 1.0 / 111322 * cos(45*pi() / 180);//每一米代表多少度
$lonDistance = 1.0 / 111322;
$radius = 1000;//1000米
$boundary_arr = [];
$count_lenth = 1;
// for (var i_total=0; i_total<count_lenth; i_total+=10) {
while(1) {
$count_lenth++;
$mLongitude_tmp = $longitude + $count_lenth * 1.5 * $radius * $lonDistance;
$mLatitude_tmp = $latitude - 2 * $count_lenth * $radius * sin(60 * pi() / 180) * $latDistance;
if ($mLongitude_tmp > $right_lng && $mLatitude_tmp < $down_lat) { // 到边界了
break;
}
if($count_lenth > 5000) break; // 安全值 防止死循环
}
for ($i = 0; $i <= $count_lenth; $i++) {
$mLongitude = $longitude + $i * 1.5 * $radius * $lonDistance;
for ($j = 0; $j <= $count_lenth; $j++) {
$mLatitude = $latitude - 2 * $j * $radius * sin(60 * pi() / 180) * $latDistance;
if ($i % 2 != 0) {
$mLatitude += $radius * sin(60 * pi() / 180) * $latDistance;
}
if($mLongitude > $right_lng && $mLatitude < $down_lat){
echo "运行结束-";
break 2;
}else{
if($i == $count_lenth){
$count_lenth = $count_lenth+2;
$i--;
echo $count_lenth ." ";
break;
}
}
$inRing = $this->is_point_in_polygon([‘lng‘=>$mLongitude,‘lat‘=>$mLatitude], $result_list); // 是否在多边形内

if($inRing == true) {
$height = $radius * sin(60*pi() / 180) * $latDistance;
$lng1 = $mLongitude - $radius / 2 * $lonDistance; $lat1 = $mLatitude + $height;
$lng2 = $mLongitude + $radius / 2 * $lonDistance; $lat2 = $mLatitude + $height;
$lng3 = $mLongitude + $radius * $lonDistance; $lat3 = $mLatitude;
$lng4 = $mLongitude + $radius / 2 * $lonDistance; $lat4 = $mLatitude - $height;
$lng5 = $mLongitude - $radius / 2 * $lonDistance; $lat5 = $mLatitude - $height;
$lng6 = $mLongitude - $radius * $lonDistance; $lat6 = $mLatitude;
$boundary_tmp = [$lng1.‘,‘.$lat1,$lng2.‘,‘.$lat2,$lng3.‘,‘.$lat3,$lng4.‘,‘.$lat4,$lng5.‘,‘.$lat5,$lng6.‘,‘.$lat6];
$boundary_arr[] = $boundary_tmp;
}
}
// if($break) break;
}
// }
return $boundary_arr;
}

/**
* 判断一个坐标是否在一个多边形内(由多个坐标围成的)
* 基本思想是利用射线法,计算射线与多边形各边的交点,如果是偶数,则点在多边形外,否则
* 在多边形内。还会考虑一些特殊情况,如点在多边形顶点上,点在多边形边上等特殊情况。
* @param $point 要查询的点
* @param $pts 要查询的范围
* @return bool
*/
public function is_point_in_polygon($point, $pts) {
$N = count($pts);
$boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
$intersectCount = 0;//穿越点数
$precision = 2e-10; //浮点类型计算时候与0比较时候的容差
$p1 = 0;
$p2 = 0;
$p = $point;

$p1 = $pts[0];
for ($i = 1; $i <= $N; ++$i) {
if ($p[‘lng‘] == $p1[‘lng‘] && $p[‘lat‘] == $p1[‘lat‘]) {
return $boundOrVertex;
}

$p2 = $pts[$i % $N];//right vertex
if ($p[‘lat‘] < min($p1[‘lat‘], $p2[‘lat‘]) || $p[‘lat‘] > max($p1[‘lat‘], $p2[‘lat‘])) {//ray is outside of our interests
$p1 = $p2;
continue;
}

if ($p[‘lat‘] > min($p1[‘lat‘], $p2[‘lat‘]) && $p[‘lat‘] < max($p1[‘lat‘], $p2[‘lat‘])) {//ray is crossing over by the algorithm (common part of)
if($p[‘lng‘] <= max($p1[‘lng‘], $p2[‘lng‘])){//x is before of ray
if ($p1[‘lat‘] == $p2[‘lat‘] && $p[‘lng‘] >= min($p1[‘lng‘], $p2[‘lng‘])) {//overlies on a horizontal ray
return $boundOrVertex;
}

if ($p1[‘lng‘] == $p2[‘lng‘]) {//ray is vertical
if ($p1[‘lng‘] == $p[‘lng‘]) {//overlies on a vertical ray
return $boundOrVertex;
} else {//before ray
++$intersectCount;
}
} else {//cross point on the left side
$xinters = ($p[‘lat‘] - $p1[‘lat‘]) * ($p2[‘lng‘] - $p1[‘lng‘]) / ($p2[‘lat‘] - $p1[‘lat‘]) + $p1[‘lng‘];//cross point of lng
if (abs($p[‘lng‘] - $xinters) < $precision) {//overlies on a ray
return $boundOrVertex;
}

if ($p[‘lng‘] < $xinters) {//before ray
++$intersectCount;
}
}
}
} else {//special case when ray is crossing through the vertex
if ($p[‘lat‘] == $p2[‘lat‘] && $p[‘lng‘] <= $p2[‘lng‘]) {//p crossing over p2
$p3 = $pts[($i+1) % $N]; //next vertex
if ($p[‘lat‘] >= min($p1[‘lat‘], $p3[‘lat‘]) && $p[‘lat‘] <= max($p1[‘lat‘], $p3[‘lat‘])) { //p.lat lies between p1.lat & p3.lat
++$intersectCount;
} else {
$intersectCount += 2;
}
}
}
$p1 = $p2;//next ray left point
}

if ($intersectCount % 2 == 0) {//在多边形外
return false;
} else { //在多边形内
return true;
}
}

pytorch可视化热力图(代码片段)

 可视化热力图可以有两种方式:1)特征图可视化,将各通道特征的最大值作为热力图像素值,进行可视化——可以参考博客,一种比较灵活的特征图保存方式2)根据梯度值结合特征图计算热力图,热力图的显示的重点是梯... 查看详情

对于百度地图新推出的热力图,国内外是不是有其他类似的产品

ArcGIS很早就有热力图。桌面版或者WebAPI都有。同时推荐一下开源的方案,都是JS的,基于其它语言的也有,google之即可:heatmap.js[1],在github上有2000多star,400多fork。它能够实现地图热度,同时还能探测鼠标的点击,实现屏幕热度。web... 查看详情

tableau图表大全11之热力图

文章目录热力图样式构建热力图GIF演示热力图样式热图是一种使用颜色显示数据的地图。可以在Tableau中创建它具有一个或多个维度和至少一个度量值。热图用于根据颜色比较数据。例如,销售额下降将为红色,而增长为... 查看详情

304arcgis_for_js热力图4.21(03)

参考技术A1,使用FeatureLayer创建热力图目前HeatmapRenderer还不支持在SceneViews中使用,只能在二维点图层中使用利用开源heatmap结合arcgisapiforjs实现自定义HeatmapLayer类,继承DynamicMapServiceLayer,然后结合heatmap.js一起这个之前在3.X中用过... 查看详情

地理县级热力图

】地理县级热力图【英文标题】:Geographicalcountylevelheatmap【发布时间】:2017-09-2509:58:14【问题描述】:我经常需要在R中创建地理热图。目前,我一直在我的办公室计算机中使用许可版本的Tableau来执行此操作,它做得非常好。但... 查看详情

python热力图绘制方法—新手教程

参考技术A#Python热力图绘制方法热力图的使用场景有 1.描述数据在空间的密集程度,常见有城市热力图,区域热力图2.描述多个变量之间相关性高低程度#step1准备数据集,读取excel列表内容,usecols=index,这里是表里的第一列不... 查看详情

leaflet+esri-leaflet+heatmap实现热力图

1.环境准备 1)下载leaflet.js插件,  官网传送:http://leafletjs.com/ 2)下载esri-leaflet.js插件,  官网传送:http://esri.github.io/esri-leaflet/ 3)下载heatmap.js插件,  官网传送:https://www.p 查看详情

请问怎么用echarts在市级地图里展示小地区热力图

参考技术Arequire.config(paths:echarts:'./js/echarts','echarts/chart/bar':'./js/echarts-map','echarts/chart/line':'./js/echarts-map','echarts/chart/map':'./js/echarts-map');varoption=title:text:'某地区蒸发量和...追问你好,这... 查看详情

vue基于百度地图实现热力图(代码片段)

...今天接到一个需求要实现在百度地图中将高排放车辆以热力图的形式展现在地图中,下面是具体的实现过程:实现效果1.安装baiduMap1.1首先要安装百度mapnpminstallvue-baidu-map--save1.2在main.js文件中引入并全局注册importBaiduMapfrom&... 查看详情

数据可视化python热力图(seaborn.heatmap)(代码片段)

Python数据可视化-热力图热力图cmapcenterannotannot_kwsfmtlinewidthslinecolorxticklabelsyticklabelsmask热力图应用热力图以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。热力图可以显示不可点击区域发生的事情。城市... 查看详情

天地图专题七:行政区域标记,热力图(以广西为例)

...的可能更大一些。 最近上个项目甲方想搞一个类似热力图,热点图的东西。在天地图API上没有找到类似的直接画热力图的接口,只好用了一些替代的方法。天地图行政区域,行政区划直接接口也没找到,用边界点自己画。&nb... 查看详情

arcpy多线程热力图(代码片段)

????起因是这样一段对话,领导:你会用脚本生成热力图图片吗?我:可以研究下。领导:那这个需求就给你了。我:......????经过一番研究,研究出大概的思路,先将有经纬度的表中的数据筛选出表并生成xy事件,接着利用核密... 查看详情

echarts图表——地图&热力图

...示访客热衷的页面区域和访客所在的地理区域的。图示热力图可以显示不可点击区域发生的事情。echarts地图是在日常项目中运用非常频繁的一类,它的配置相较于之前的柱状图、折线图和饼图有明显的区别。热力图是在地图的... 查看详情

vue+echarts4.x地图下钻/散点分布以及热力图

...要实现三个功能国家到省级的地图下钻和散点分布以及热力图显示网上资料蛮少的,记录一个给后面的小伙伴一些参考,如果帮到你请点赞d=====( ̄▽ ̄*)b中国地图下显示为热力图,显示精确分布点只是demo所以数据是自己写的假... 查看详情

leaflet绘制热力图

时下用的最多的开源二维webgis引擎应该是openlayers与leaflet了,leaflet因其轻量、灵活性得到了越来越多的应用。并且leaflet的插件也非常多,综合使用的话,可以很容易的实现数据的可视化分析与应用1、leaflet-heat插件leaf... 查看详情

如何制作炫酷的热力图

如何制作炫酷的热力图来自:http://mp.weixin.qq.com/s/s85vBmTv1GdzozQMWjY6xA2017-11-07 ArcGIS带你飞  飞言飞语 Attention “热力图”是描述趋势变化强力武器,可以将报告内容瞬间提升一个档次,不过,制作“热力... 查看详情

无需代码绘制出的热力图,0基础小白也能3分钟上手

...后台看到有粉丝私信我,问说经常在网上看到这种热力图,自己也想学,但不知道这种动态的热力图要怎么做。其实方法很多,用Excel、FineBI、R语言等都可以实现我分别用这三种方法试了一下1、用Excel做需要安装D... 查看详情

#openlayer热力图显示(代码片段)

openlayer热力图显示相关库类importmomentfrom\'moment\'importProjectionfrom\'ol/proj/Projection\'importStaticfrom\'ol/source/ImageStatic\'importMapfrom\'ol/Map\'importImageLayerfrom\'ol/layer/Image\'importViewfr 查看详情