gpt4 book ai didi

sql - 地理位置 SQL 查询找不到确切位置

转载 作者:可可西里 更新时间:2023-11-01 07:31:48 29 4
gpt4 key购买 nike

我测试我的地理定位查询已经有一段时间了,直到现在我还没有发现任何问题。

我试图搜索给定半径内的所有城市,通常我使用城市的坐标搜索城市周围的城市,但最近我尝试在城市周围搜索并发现城市本身没有返回。

我的数据库中有这些城市的摘录:

city            latitude    longitude  
Saint-Mathieu 45.316708 -73.516253
Saint-Édouard 45.233374 -73.516254
Saint-Michel 45.233374 -73.566256
Saint-Rémi 45.266708 -73.616257

但是当我在 Saint-Rémi 市周围运行查询时,使用以下查询...

SELECT tblcity.city, tblcity.latitude, tblcity.longitude, 
truncate((degrees(acos( sin(radians(tblcity.latitude))
* sin(radians(45.266708))
+ cos(radians(tblcity.latitude))
* cos(radians(45.266708))
* cos(radians(tblcity.longitude - -73.616257) ) ) )
* 69.09*1.6),1) as distance
FROM tblcity HAVING distance < 10 ORDER BY distance desc

我得到这些结果:

city            latitude    longitude     distance  
Saint-Mathieu 45.316708 -73.516253 9.5
Saint-Édouard 45.233374 -73.516254 8.6
Saint-Michel 45.233374 -73.566256 5.3

Saint-Rémi 镇不在搜索范围内。

所以我尝试了修改查询希望得到更好的结果:

SELECT tblcity.city, tblcity.latitude, tblcity.longitude, 
truncate(( 6371 * acos( cos( radians( 45.266708 ) )
* cos( radians( tblcity.latitude ) )
* cos( radians( tblcity.longitude )
- radians( -73.616257 ) )
+ sin( radians( 45.266708 ) )
* sin( radians( tblcity.latitude ) ) ) ),1) AS distance
FROM tblcity HAVING distance < 10 ORDER BY distance desc

但我得到了相同的结果...

但是,如果我通过将纬度或经度的最后一位数字更改为 1 来稍微修改 Saint-Rémi 的坐标,则两个查询都将返回 Saint-Rémi。此外,如果我将查询集中在上面的任何其他城市,则搜索到的城市将在结果中返回。

任何人都可以阐明可能导致我上面的查询不显示搜索到的 Saint-Rémi 市的原因吗?我在下面添加了一个表格示例(删除了额外的字段)。

我正在使用 MySQL 5.0.45,在此先感谢。

CREATE TABLE `tblcity` ( 
`IDCity` int(1) NOT NULL auto_increment,
`City` varchar(155) NOT NULL default '',
`Latitude` decimal(9,6) NOT NULL default '0.000000',
`Longitude` decimal(9,6) NOT NULL default '0.000000',
PRIMARY KEY (`IDCity`)
) ENGINE=MyISAM AUTO_INCREMENT=52743 DEFAULT CHARSET=latin1 AUTO_INCREMENT=52743;

INSERT INTO `tblcity` (`city`, `latitude`, `longitude`) VALUES
('Saint-Mathieu', 45.316708, -73.516253),
('Saint-Édouard', 45.233374, -73.516254),
('Saint-Michel', 45.233374, -73.566256),
('Saint-Rémi', 45.266708, -73.616257);

最佳答案

在您的第一个查询中,我相信您已经在减法中反转了经度。余弦球面定律是:

d = acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(long2−long1))*R

如果将 lat1 替换为 tblcity.latitude,则 long1 必须替换为 tblcity.longitude。我认为您不小心在查询中替换了 long2。这个效果更好吗?

SELECT tblcity.city, tblcity.latitude, tblcity.longitude, 
truncate((degrees(acos( sin(radians(tblcity.latitude))
* sin(radians(45.266708))
+ cos(radians(tblcity.latitude))
* cos(radians(45.266708))
* cos(radians(-73.616257 - tblcity.longitude) ) ) )
* 69.09*1.6),1) as distance
FROM tblcity HAVING distance < 10 ORDER BY distance desc

我还没有调查您的第二个查询,但希望这对您有所帮助。

关于sql - 地理位置 SQL 查询找不到确切位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695365/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com