如何在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)