如何在mysql查询中找到所选对角线区域之间的准确数据

Posted

技术标签:

【中文标题】如何在mysql查询中找到所选对角线区域之间的准确数据【英文标题】:how to find exactly data between selected diagonal area in mysql query 【发布时间】:2013-12-30 13:02:09 【问题描述】:

这些是我选择的对角点的坐标,选择的点越多就会越多。

1: 25.312063043186914  2: 55.30672073364258
1: 25.24096949112138   2: 55.40525436401367
1: 25.224509592006314  2: 55.3462028503418
1: 25.22513076073063   2: 55.281314849853516
1: 25.27822894908031   2: 55.25899887084961

以下是我当前的 mysql 查询在所选对角线之间没有给我完美的结果。有什么帮助吗??

SELECT 
  * 
FROM
  tbl_custom 
WHERE latitude <= 25.312063043186914 
  AND latitude >= 25.224509592006314 
  AND longitude <= 55.40525436401367 
  AND longitude >= 55.25899887084961 

【问题讨论】:

应该可以,你使用的是正确的mysql类型吗? DECIMAL(总位数,小数) 是的,我的纬度和经度字段的mysql数据类型是十进制,我得到了结果,但它也在我选择的对角点上做标记? 看看point-in-polygon 问题。编写代码并不容易;-) Postgres 为此预定义了functions。也许mysql也有。 也许我误解了这个问题,但你所有的 SQL 目前会给你的是由对角对角定义的矩形区域内的任何点 (25.224509592006314,55.25899887084961) - (25.312063043186914,55.4052543640136)。所以看看你上面的截图,我把它想象成一个完全包围你的多边形的矩形,所以可能会导致很多误报 【参考方案1】:

要消除边界框查询内但不在多边形内的点,您需要使用Point in Polygon 算法。

最简单的方法是将坐标保存在数组中。这些可用于查找查询的最大和最小坐标以及 pointInPolygon() 函数的参数。

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;

在您的地图代码中使用jQuery getJSON()

var polySides = 4;//number of points in polygon
//horizontal Latitude coordinates of polygon  
var polyLat = new Array();
polyLat[0] = 51.5;
polyLat[1] = 51.5;
polyLat[2] = 52.5;
polyLat[3] = 53;
polyLat[4] = 51.5;//First point repeated to close polygon
//vertical Longitude coordinates of polygon 
var polyLng =  new Array();
polyLng[0] = 0.5;
polyLng[1] = -1.9;
polyLng[2] = -1;
polyLng[3] = 0.6;
polyLng[4] = 0.5;
//Coordinates for bounding box
var maxLat = Math.max.apply(null,polyLat);
var minLat = Math.min.apply(null,polyLat);
var maxLng = Math.max.apply(null,polyLng);
var minLng = Math.min.apply(null,polyLng);

//Using jQuery
var url = "yourFile .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);
);

使用 Bounding Box 和 Point in Polygon 获得的地图。

【讨论】:

,能否请您显示 php 文件,您是如何进行查询的。谢谢

以上是关于如何在mysql查询中找到所选对角线区域之间的准确数据的主要内容,如果未能解决你的问题,请参考以下文章

如何检测所选对象与列表中其他对象之间的碰撞

如何在地图上找到围绕对角线的边界矩形? (地理位置)

mysql中的ST_Distance_Sphere没有给出两个位置之间的准确距离

我如何在 MYSQL 表中找到两个不同日期之间的数据,例如(29-05-2021 到 08-06-2021)

如何获得两个地方之间的准确或(接近准确)距离? mysql/php

如何使用数据库(mysql)中的gps位置在两个地理点之间找到pople?