在给定范围内查找lat / lng点

时间:2016-01-30 18:44:32

标签: php ios mysql google-maps geolocation

我有一个问题,我无法解决这个问题:)

基本上我有一个基于php / mysql的系统和一个包含lat / lng中的一组点的表。

另一方面,我有一个带谷歌地图的iOS应用程序,当相机位置发生变化时,我会提交用户正在观察的当前区域的上/左,下/右点(这是我需要的,我不是'需要地图的视点。)

我需要能够通过给定一个边界“框”(地球上的矩形区域)找到这些点的特定子集,其中包含顶部/左侧,底部/右侧点。

这有效 - 没有问题。

但是当地图自由旋转时 - 由于顶部/左侧,底部/右侧点的方向发生变化而且事件发生了变化,事情变得完全错误...... mysql查询一无所获。

现在......我想到了修复就是旋转矩形区域 - 但问题是用户可以自由旋转地图,一会儿矩形区域就不再是矩形了我甚至不确定如何在这个阶段获取积分:)

有没有人遇到过这种问题,你是如何解决的?

PS:是的,最简单的方法是使用圆形区域和给定的中心点,但是......我的客户正在调用它......:/

3 个答案:

答案 0 :(得分:2)

首先创建包含旋转矩形的边界框,并将边界框的坐标发送到php / MySQL,然后使用pointInPolygon()消除旋转矩形外的点。

用于将边界框的坐标发送到php / MySQL文件的javascript代码

function searchLocations(){
    var bounds = new google.maps.LatLngBounds();
    var url = "dbtoJSON.php";
    url +="?maxLat="+maxLat +"&minLat="+minLat +"&maxLng="+maxLng +"&minLng="+minLng;
     $.getJSON(url,function(data) {
        $.each(data.marker,function(i,dat){
            if (pointInPolygon(polySides,polyLat,polyLng,dat.lat,dat.lng)){
                var latlng = new google.maps.LatLng(dat.lat,dat.lng); 
                addMarker(latlng,dat.name);
                bounds.extend(latlng);
                    }//
            });
        map.fitBounds(bounds);

    });
}


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;
}

php / MySQL文件dbtoJSON.php

// Get parameters from URL
$maxLat = $_GET["maxLat"];
$minLat = $_GET["minLat"];
$maxLng = $_GET["maxLng"];
$minLng = $_GET["minLng"];
//array to hold location array
$arr = array();

// Prepare statement
$stmt = $dbh->prepare("SELECT  name, lat, lng FROM gbstn WHERE (lat BETWEEN ? AND ? )AND (lng BETWEEN ? AND ?)");
// Assign parameters
$stmt->bindParam(1,$minLat);
$stmt->bindParam(2,$maxLat);
$stmt->bindParam(3,$minLng);
$stmt->bindParam(4,$maxLng);
//Execute query
$stmt->setFetchMode(PDO::FETCH_OBJ);
$stmt->execute();
//Show the results  
while($obj = $stmt->fetch()) {  
    $arr[] = $obj;
}
if (count($arr) >= 1)
{
    echo '{"marker":'.json_encode($arr).'}';
}

Point in polygon

答案 1 :(得分:1)

步骤1.您已旋转矩形4点。从它们中选择最大和最小坐标,它将是min_latitude,max_latitude,min_longitude,max_longitude。使用这些值,您可以绘制正常的矩形区域,并从您的基础获得所需的结果。

enter image description here

步骤2.在接收到的结果中,您将获得放置在计算矩形和旋转矩形中的点,但有些点将在旋转的矩形之外,但仍处于正常矩形。因此,排除错误的点,您将获得适合旋转矩形的点。

enter image description here

答案 2 :(得分:-1)

如果您是旋转角度,您应该能够定义旋转矩阵并将其应用于定义矩形的原始4个点。

相关问题