找到特定角度的地方附近 - 在圆圈查询中仅考虑前半部分而不是后部

时间:2014-10-14 09:26:39

标签: mysql google-maps geolocation

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

但我现在希望从中做一些不同的事情。这里发生的是查询从包含整个半径圆的点的中心返回结果。我希望只获得半圈的积分。我知道这是可能的,它的所有数学计算和我都很弱,这就是寻求专家帮助的原因。

看到这张图片,它会给出非常明确的想法。Only front part location is needed, not the back side part. Need to ignore the back side part.

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

欢迎所有建议。

1 个答案:

答案 0 :(得分:1)

您可以使用半径的余弦/球面定律来绘制线段内的点。然后使用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;

使用此技术进行地图 enter image description here     }

请参阅Demo