在特定角度的位置附近查找 - 在圆形查询中只考虑前面的半圈而不是后面

Posted

技术标签:

【中文标题】在特定角度的位置附近查找 - 在圆形查询中只考虑前面的半圈而不是后面【英文标题】:Find near by places of specific angle - consider only half circle of front not the back in round circle query 【发布时间】:2014-10-14 09:26:38 【问题描述】:

我知道如何使用圆圆半径查询从 mysql 数据库中查找附近的位置,并且我在另一个 SO 问题上也给出了相同的答案here。

但我现在想做一些不同的事情。这里发生的是查询从包括整个半径圆的点的中心返回结果。我希望只得到半圈的分数。我知道这是可能的,而且它都是数学计算,我在这方面有点弱,这就是为什么寻求专家帮助的原因。

看这张图,思路很清晰。

正如您在图片中看到的,只需要前面部分的位置,而不需要背面部分。需要忽略背面部分。此外,我将半径划分为不同颜色,使它们显示为区域 - 比如红色是区域 1,橙色是区域 2,黄色是区域 3。这是过滤数据(位置)的虚拟区域。

欢迎所有建议。

【问题讨论】:

【参考方案1】:

您可以使用Haversine/Spherical Law of Cosines 为半径绘制线段内的点。然后使用 pointInPolygon() 仅查找段内的那些。您还需要创建多边形的函数。

polySides = number of sides in polygon
pointLatArr = Lat of point in in polygon array
pointLngArr = Lng of point in in polygon array
dat.lat = Lat from Haversine results
dat.lng = Lng from Haversine results

if (pointInPolygonpolySides,pointLatArr,pointLngArr,dat.lat,dat.lng))
     var latlng = new google.maps.LatLng(dat.lat,dat.lng); 
     addMarker(latlng,dat.name);
     bounds.extend(latlng);
  

 function pointInPolygon(polySides,polyX,polyY,x,y) 
 var j = polySides-1 ;
  oddNodes = 0;
  for (i=0; i<polySides; i++) 
    if (polyY[i]<y && polyY[j]>=y  ||  polyY[j]<y && polyY[i]>=y) 
        if (polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x)  
            oddNodes=!oddNodes; 
        
    
   j=i; 

  return oddNodes;
    

分段多边形的功能

function drawSegment(start,end,radius)  
var d2r = Math.PI / 180;
pointLatArr = new Array();
pointLngArr = new Array();
polyLatLngs = new Array(); // latLngs of polygon
var polyLat = (radius /3963.189) / d2r; // miles
var polyLng = polyLat / Math.cos(center.lat() * d2r);
var centerLatLng = new google.maps.LatLng(center.lat(),center.lng());//Center to start
pointLatArr.push(center.lat());
pointLngArr.push(center.lng());
polyLatLngs.push(centerLatLng);
bounds.extend(centerLatLng);
// Create polygon points (extra point to close polygon)
for (var i = start; i < end; i++) 
    // Convert degrees to radians
    var theta = i * d2r;
    var pointLat = center.lat() + (polyLat * Math.sin(theta));
    var pointLng = center.lng() + (polyLng * Math.cos(theta));
    var pointLatLng = new google.maps.LatLng(
    parseFloat(pointLat), parseFloat(pointLng));
    polyLatLngs.push(pointLatLng);
    pointLatArr.push(pointLat);
    pointLngArr.push(pointLng);
    bounds.extend(pointLatLng);

var centerLatLng = new google.maps.LatLng(center.lat(),center.lng());//End to center
polyLatLngs.push(centerLatLng);
pointLatArr.push(center.lat());
pointLngArr.push(center.lng());
polySides = polyLatLngs.length;

使用这种技术的地图

Demo

【讨论】:

你能分享这个地图链接吗?它可以在线获得吗?如果是,我想在线查看,以便测试一些场景。 @Scorpion 演示添加到答案

以上是关于在特定角度的位置附近查找 - 在圆形查询中只考虑前面的半圈而不是后面的主要内容,如果未能解决你的问题,请参考以下文章

此查询的 MySQL 确切语法:查找附近的位置

使用地图查找特定的附近地点

使用相同的安卓应用在谷歌地图中查找附近设备的位置

在循环数据中查找异常值

查询地理位置附近的东西?

vertx+redis实现查找附近的人