我很抱歉,如果这是回答其他地方;我看了,试了好几件事,但都解决不了。
我想做的是:在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`
谢谢你的帮助。
1条答案
按热度按时间lskq00tm1#
你的正弦/余弦计算会很慢,而且不能使用索引。然而,mysql很好地支持几何图形和r树索引,以实现高效访问。
存储位置的方法是将它们放在数据类型中,如
POINT
使用几何函数st_distance
计算距离。基于您的信息的示例:
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