我在 MySQL 数据库中有一个名为“flags”的表,有 400,000 行。该表由代表英国各地不同位置的地理空间点组成。
我正在创建的应用程序使用 Google map 。 map 上有一个按钮,可以切换标志在 map 上的可见性。我现在的工作是创建一个 API,当传递一个边界框时返回边界框内的所有标志(以便它们可以显示在 map 上)。
传递的参数是视口(viewport)当前位置的东北纬度/经度和西南纬度/经度。
我现在需要执行一个 SQL 查询,该查询将返回这组坐标(视口(viewport))内的所有地理空间点。
理想情况下,需要优化解决方案,因为要搜索的行很多。但是,该应用程序确实会强制您在用户显示标志之前放大到某个级别。
标志表:
示例行:
1 | [几何 - 25B] |坚韧AB
也可以使用 AsText(coordinates) 将坐标字段转换为文字点。然而,X 和 Y 函数会为您做这件事。
坐标列数据类型:POINT
我知道要获取某个点的纬度/经度,您可以使用 X 和 Y 函数。例如,可以像这样检索一个点的纬度:X(coordinates)
数据库管理系统:MySQL
数据库管理系统版本:5.6.14
最佳答案
大概您的 geometry 列中的 POINT 数据中的 x 和 y 项是以纬度和经度表示的。
要在 MySQL 中高效地执行此查找,您需要做一些事情。
ALTER TABLE flags ADD SPATIAL INDEX(坐标)假设您的纬度/经度框是一个以 Winchester Cathedral (51.0606, -1.3131) 为中心、范围为 1 度的矩形.您需要围绕该点的边界框。此 MySQL 查询将为沿对角线穿过该边界框的直线生成 LINESTRING(文本)。
SELECT
CONCAT('LINESTRING(',
latitude-0.5,' ',longitude-0.5,
',',
latitude+0.5 ,' ',longitude +0.5,
')') AS box
FROM (
SELECT 51.0606 AS latitude, -1.3131 AS longitude
) AS coord
查询得到这个:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
您还可以使用宿主语言中的字符串处理来生成类似的文本字符串。你需要的格式是这样的。
LINESTRING(lat1 long1, lat2 long2)
然后您可以使用它来搜索您的空间表,如下所示:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
这将利用空间索引并找到坐标位于该对角线边界框内的每一行 flags。
这是一些 documentation .
如果您的 flags 表包含少于几十万行,您可能会发现带有纬度和经度列(FLOAT 数据类型,索引)的普通表(不是空间表)执行如下很好,更容易开发和调试。
我已经写了一个关于该技术的教程。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
关于mysql - 选择边界框内的所有地理空间点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21208697/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述