mysql循环

fwzugrvs  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(259)

我很抱歉,如果这是回答其他地方;我看了,试了好几件事,但都解决不了。
我想做的是:在mysql中,我有一个表包含来自警察局的服务数据调用,另一个表包含空属性。每个表都有纬度、经度字段。我们想知道每一个服务电话,是不是在100英尺范围内的空置物业?下面是我们使用示例坐标编写的查询,用于测试距离分析是否有效:

SELECT
    address, (
        (20903520) 
    * acos (
        cos ( radians(38.67054) )
        * cos( radians( lat ) )
        * cos( radians( long ) - radians(-90.22942) )
        + sin ( radians(38.67054) )
        * sin( radians( lat ) )
    )
) AS distance
FROM vacants
HAVING distance < 100;

我如何编写一个循环来遍历服务位置的每个调用,并针对每个空闲位置进行测试,以查看在每个调用中,是否在半径为100英尺的范围内找到了空闲的属性?我尝试过编写declare语句、创建计数器变量以及使用begin/end语法。他们似乎都没能完成,尽管也许我写得不对。sql不是我的强项;我更喜欢python,但是我们认为通过sql查询来实现这一点要比循环使用.csv文件快。大约有250万个呼叫服务记录。最后,我们希望能够说“在250万个服务呼叫中,有x多个在空置物业的100英尺范围内。”我还希望能够输出一个.csv文件,其中包含空置物业的地址,100英尺半径范围内空置物业与服务呼叫的距离,以及服务调用表中的另外两个字段(原始调用代码和最终调用代码)。
类似于这样,但是添加了两个字段。这来自我提供的测试查询。

我们还想做反向分析,看看有多少服务要求在100英尺半径的每个属性。
下面是示例数据-服务坐标调用:

38.595767638008056,-90.2316138251402
38.57283495467307,-90.24649031378685
38.67497061776659,-90.28415976525395
38.67650431524285,-90.25623757427952
38.591971519414784,-90.27782710145746
38.61272746420862,-90.23292862245287
38.67312983860098,-90.23591869583113
38.625956494342674,-90.18853950906939
38.69044465638584,-90.24339061920696
38.67745024638241,-90.20657832034047`

空置物业坐标:

38.67054,-90.22942
38.642956,-90.21466
38.671535,-90.27293
38.666367,-90.23749
38.65339,-90.23141
38.645996,-90.20334
38.60214,-90.224815
38.67265,-90.214134
38.665504,-90.274414
38.668354,-90.269966`

谢谢你的帮助。

lskq00tm

lskq00tm1#

你的正弦/余弦计算会很慢,而且不能使用索引。然而,mysql很好地支持几何图形和r树索引,以实现高效访问。
存储位置的方法是将它们放在数据类型中,如 POINT 使用几何函数 st_distance 计算距离。
基于您的信息的示例:

CREATE TABLE vacants (address varchar(255), geo POINT NOT NULL SRID 4326,  SPATIAL KEY (geo))
insert into vacants VALUES ('123 some str', ST_PointFromText('POINT(8.6949639 50.1139589)', 4326) );
insert into vacants VALUES ('123 some ave', ST_PointFromText('POINT(8.6779835 50.1156941)', 4326) );
SELECT address, st_distance(geo, ST_PointFromText('POINT(8.532687 50.1036198)', 4326)) as `distance in meters` FROM vacants;
+--------------+---------------------+
| address      | distance in meters  |
+--------------+---------------------+
| 123 some str | 17983.567531177974  |
| 123 some ave | 16124.382142034325  |
+--------------+---------------------+
2 rows in set (0,00 sec)

srid值4326描述了空间关系id,并描述了类似地球的几何系统。对于其他行星或人造几何结构,你需要不同的值。我所描述的几何图形是wkt或“众所周知的文本”,这是描述各种几何对象的标准形式。数据也可以以其他格式提供(例如geojson或其他格式),我选择的位置在德国中部的某个地方。
有了这个距离,你应该可以很容易地创建反向搜索。
有关所有详细信息,请参阅https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html 以及https://dev.mysql.com/doc/refman/8.0/en/spatial-analysis-functions.html

相关问题