从Google Maps .getBounds中获取MySQL数据库中的所有记录?

Mik*_* L. 17 php mysql google-maps

好吧,我有大约1800行的数据库,每个人都有一个列latlong,我想做的事,这对谷歌地图V3查询.getBounds的结果是一样的东西((33.564398518424134, -79.38014701875002), (35.375726155241175, -76.08424858125002))我想要做的,是得到它的纬度和经度的每个记录数据库在这些范围内.有什么建议?

我想我将不得不推断地图的其他两个角,因为.getBounds只包含2个点(我想的地图的两个角),我想要在4个点内.如果我这样做,我会得到一个类似的数组...现在纠正我,如果我错了,但这应该是地图的NW,NE,SW,SE角落,在lat-lng.

33.564398518424134, -79.38014701875002
33.564398518424134, -76.08424858125002
35.375726155241175, -79.38014701875002
35.375726155241175, -76.08424858125002
Run Code Online (Sandbox Code Playgroud)

好的,那么如果我有这些数据,我将如何构建查询以获取这些坐标内的行?表被称为tilistings-列latlng......也是,如果有一个更简单的方法,还是我只是用我的方法疯了,请随时让我知道.

谢谢

ser*_*gio 32

以前的所有答案仅适用于1/4的世界!

W3t Tr3y的答案很接近,但它有一个错误(额外的"<").

所有这些只适用于美国,因为它位于北半球.它们不适用于南半球,也不适用于东部国家(格林威治权).

这是一个没有功能或复杂内容的简单解决方案.

字母是从map.getBounds()获得它们的顺序的结果,即swlat,swlng,nelat,nelng = a,b,c,d.

SELECT * FROM tilistings WHERE
(CASE WHEN a < c
        THEN lat BETWEEN a AND c
        ELSE lat BETWEEN c AND a
END) 
AND
(CASE WHEN b < d
        THEN lng BETWEEN b AND d
        ELSE lng BETWEEN d AND b
END) 
Run Code Online (Sandbox Code Playgroud)

或其他解决方案和/或(你可以测试它的速度,我不知道如何在WorkBench中多次运行它)

SELECT * FROM tilistings WHERE
(a < c AND lat BETWEEN a AND c) OR (c < a AND lat BETWEEN c AND a)
AND 
(b < d AND lng BETWEEN b AND d) OR (d < b AND lng BETWEEN d AND b)
Run Code Online (Sandbox Code Playgroud)

现在你可以映射整个世界:)我希望有人可以将上述答案标记为不正确,因为它们让我们失去了很多像我一样的数百万学习者的时间.我不知道当他们真的不工作时他们会得到这么多的选票!

PS:你的地图像素边缘与坐标的精确15位小数值匹配的几率是错过整个3/4世界的几率的几万亿倍!


ben*_*siu 17

如果来自谷歌:((a,b),(c,d))

SELECT * FROM tilistings WHERE lat > a AND lat < c AND lng > b AND lng < d

  • Mike L.:你不会过度复杂化它.这个简短的答案仅适用于美国,即您只处理正数.如果你必须考虑赤道以下的纬度或格林威治以外的经度,那么计算就更复杂了.看我的回答. (5认同)
  • 嗯,我认为这会比那更困难,谢谢我想太多了 (4认同)
  • Segio 的答案是值得一看的 - 继续滚动。当您开始处理像新西兰这样的地方时,此解决方案完全失败。 (3认同)