当前位置: 首页 > 知识库问答 >
问题:

在给定范围内寻找LAT/LNG点

璩涛
2023-03-14

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

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

我需要能够找到这些点的一个特定子集,给出一个边界“框”--地球上的一个矩形区域--有一个上/左,下/右点。

这是可行的-没有问题。

但是当地图被自由旋转时-事情就会变得完全不对,因为上/左,下/右点的方向被改变了,当然…mysql查询什么也找不到。

现在..我想到的解决办法是旋转矩形区域--但问题是,用户可以自由旋转地图,在某一时刻,矩形区域将不再是矩形,我甚至不确定在这个阶段如何获取点:)

PS:是的,最简单的方法是使用一个圆形区域和一个给定的中心点,但是…我的当事人称之为...:/

共有1个答案

商嘉木
2023-03-14

首先创建包含旋转矩形的包围盒并将包围盒的坐标发送给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).'}';
}
 类似资料:
  • 我正在尝试编写一个Heap排序方法,它只在传入方法的给定范围内执行排序。传入的范围是低和高,这些值对应于堆中的值,而不是堆的索引。例如,输入数组可能是:28 10 49 20 59 61 17,如果low=49,high=61,Heap排序后的结果数组将看起来像这样:28 10 20 49 59 61 17。范围之外的值保持不变。我已经有了一个工作的Heap排序方法,但我的问题是如何修改这个方法以

  • 我无法降低这个问题的复杂性。请给出一些更好的方法。 有没有一个我不知道的数学公式,或者它可以用更好的方法来完成? 我是这样做的:

  • 我有N个数字,让我们说。现在我想找出在给定范围内有多少对数字。(L和R给定)。数字对=两个数字相同。我的方法:

  • 假设您有一个间隔列表,例如[(0 4),(1 3),(2 5),(2 6)]。此列表未排序。然后给您一个范围,如[1 5]。您必须返回适合范围内的间隔数。在这个问题中,它将返回2。((1 3)和(2 5)) 间隔列表保持不变,但我们最多得到100000个查询,每个查询由一个范围组成。对于每个范围查询,我们必须返回适合其中的间隔数。 在研究之后,我读到了间隔树。但是,您只能查询与任何给定范围重叠的间

  • 问题内容: 如何在给定范围之间生成奇数随机数。 对于例如:对于1到6之间的范围。随机编号为3或1或5 产生随机数的方法: 请参阅如何在Java中生成特定范围内的随机整数? 产生奇数随机数的方法 此函数将始终将2转换为3而不是1。我们能否使它成为一个更随机的函数,该函数有时将2转换为3,有时转换为1? 问题答案: 假设max为包容性,我建议以下几点: 它导致所有奇数之间的偶数分布。

  • 所以如果我有一个lat-lng&一个距离。我可以用距离和起点(lat-lng)计算下一个点(lat-lng)吗。方向无关紧要。 所以基本上我想要的是像lat2-lng2=lat1-lng1(一些公式)的距离,如下所示