php - 查找给定范围内的纬度/经度点

标签 php ios mysql google-maps geolocation

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

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

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

我需要能够通过给定一个边界“框”(地球上的矩形区域)以及上/左、下/右点来找到这些点的特定子集。

这有效 - 没有问题。

但是本地图自由旋转时 - 事情会完全错误,因为上/左、下/右点的方向发生了变化,当然.. mysql查询什么也找不到。

现在..我想到解决办法是旋转矩形区域 - 但问题是用户可以自由旋转 map ,并且在某一时刻矩形区域将不再是矩形,并且我我什至不知道现阶段如何获取积分:)

有人遇到过这样的问题吗?您是如何解决的?

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

最佳答案

首先创建包含旋转矩形的边界框,并将边界框的坐标发送到 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

关于php - 查找给定范围内的纬度/经度点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35105617/

相关文章:

php - 数据库中的空值

php - Laravel - 如何从 Guzzle 保存二进制文件

javascript - 尽管用户已登录 wordpress,但要求用户登录不适用于重力形式

objective-c - 在 NSXMLParser 委托(delegate)方法中解码百分比转义字符串

iphone - iPad 旋转中的文本字段动画

php - 用 PHP 发布 1 张以上的图片?

php 脚本没有打开欢迎页面,也没有使用 wamp 写入数据库

ios - 在标签栏上添加 UIVisualEffectView

php - id在数组中的Mysql

mysql - 如何在我的表中正确使用索引?