2017-06-06 222 views
1

我正在使用MySQL 5.5.52。缩写:Lat =纬度,Long =经度,NE =东北,SW =西南。经纬度长度在经纬度范围内

我有两个SQL表格:

第一个表格包含“区域”。每个区域由ID,NE Lat,NE Long,SW Lat,SW Long组成。

第二个表格包含“点”。每个点由ID,Lat,Long组成。

我需要给定区域ID列表将在这些地区返回点的SQL语句。如果一个点的Lat-Long位于由区域的NE Lat-Long和SW Lat-Long定义的右上角和左下角的平方内,则该点定义在Area中。

注意:我可以将区域更改为具有半径的单个经纬度长度,其中点位于“圆圈”内。但理想情况下,我不想这样做,除非有更高效的SQL语句来解决这个问题。

+0

所以像这样:'WHERE(Points.Lat> Areas.SWLat AND Points.LAT Areas.SWLong AND Points.Long

+0

简而言之,我从未在数据库中存储空间数据,也不知道最佳方式。 RKRC的答案似乎为我做了这份工作。按照你的方式(在where子句而不是联接中)有没有优势? – AndyW

+0

对于所有意图和目的,它们(通常)都是相同的东西。 '之间'是包含性的,所以它是<= and > =。至于加入ON与WHERE,他们通常是相同的执行。 –

回答

1

加入两个表基于条件点位置属于区域范围内。

Select areaTable.*, pointsTable.* 
From pointsTable 
Join areaTable 
On pointTable.lat between areaTable.SWLat and areaTable.NELat 
and 
pointTable.long between areaTable.SWLong and areaTable.NELong 

给你每个区域和相应的点。

如果需要,可以使用where子句进一步参数化特定区域。

Where [email protected] 
and [email protected] 
and [email protected] 
and [email protected] 

只需用您喜欢的lat和long值替换@s即可。

+0

这似乎工作!然而,对于我的where子句,我只是在'where areaTable.id in(1,2,3 ...)'这似乎产生了期望的结果,这是个好主意吗? – AndyW

+0

是的。这是做到这一点的方法。如果一切顺利,请不要忘记标记为已接受的答案 – RKRC