【问题标题】:cities and distance by latitude-longitude经纬度城市和距离
【发布时间】:2010-02-09 23:06:21
【问题描述】:

我有一张桌子:

城市 纬度 经度

而且我需要一个 sql 查询来了解所有城市距离纽约 100 英里。

【问题讨论】:

  • 顺便说一句,我强烈建议您接受问题的答案。否则人们不会帮助你那么多。看看你的问题并接受那些帮助你解决问题的答案。

标签: sql mysql


【解决方案1】:

这是我们的。您可能需要针对您的表结构对其进行修改。我们查找的是零售地点(和便利设施),而不是城市,但困难的部分是在此声明中有效的“距离最近”。

CREATE PROCEDURE [dbo].[GetNearbyLocations] @CenterLatitude FLOAT, @CenterLongitude FLOAT
AS

DECLARE @CntXAxis FLOAT 
DECLARE @CntYAxis FLOAT 
DECLARE @CntZAxis FLOAT 

SET @CntXAxis = COS(RADIANS(@CenterLatitude)) * COS(RADIANS(@CenterLongitude)) 
SET @CntYAxis = COS(RADIANS(@CenterLatitude)) * SIN(RADIANS(@CenterLongitude)) 
SET @CntZAxis = SIN(RADIANS(@CenterLatitude)) 

SELECT LocationId, LocationName, Address, City, State, Zip, Phone, Latitude, Longitude,
               hasATM, hasCarWash, hasDiesel, hasE85, is24hr, hasTrendar, hasWiFi, isTravelCenter, isMiniTravelCenter, isTruckerFriendly, hasScale, hasHotFood,
               ProxDistance = 3961 * ACOS( dbo.XAxis(latitude, longitude)*@CntXAxis + dbo.YAxis(latitude, longitude)*@CntYAxis + dbo.ZAxis(latitude)*@CntZAxis) 
FROM Locations 
WHERE latitude IS NOT NULL 
ORDER BY ProxDistance ASC
GO

编辑 - 添加(对不起,我最初错过了这些)

-- USER-DEFINED FUNCTIONS
-- XAxis #########################################
CREATE FUNCTION [dbo].[XAxis] (@lat float, @lon float)  
RETURNS float
AS  
BEGIN 
   RETURN COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lat) * COS(4 * (4 * atn2(1, 5) - atn2(1, 239)) / 180 * @lon) 
END

CREATE FUNCTION [dbo].[YAxis] (@lat float, @lon float)  
RETURNS float AS  
BEGIN 
RETURN COS(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat) * SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lon)
END

CREATE FUNCTION [dbo].[ZAxis] (@lat float)  
RETURNS float AS  
BEGIN 
RETURN SIN(4 * (4 * atn2(1,5) - atn2(1,239)) / 180 * @lat)
END

【讨论】:

  • 如果有很多潜在记录(这会影响查询效率),您需要将结果修剪为参考点 (NYC) 的边界矩形内的结果,然后执行距离公式查看候选城市是否在圆形距离内。
  • 什么是dbo.XAxis(latitude, longitude)?您是否定义了XAxis FUNCTION? (对于 YAxis 和 ZAxis 类似)
  • @Ortwin Gentz - 更新了我的答案。谢谢你指出这一点。我忘了包括那些。
  • 谢谢。虽然解决方案看起来相当复杂,但我担心所有存储过程的性能都不是很好。在我的测试中,通过去掉 ORDER BY 参数中的过程调用,我观察到了显着的速度提升。
【解决方案2】:

也许这对你有帮助:http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
这是一个很好的介绍。或者直接googlemysql distance queries,你会找到一些教程。

如果您有可能并且想要更轻松,请切换到支持开箱即用距离查询的PostgreSQL

【讨论】:

    【解决方案3】:

    您需要纽约市的经纬度,或者您要分析的任何城市。然后只需使用数学测量两组坐标之间的英里数。在 Excel 中,公式为

    getDistance(latitude1, longitude1, latitude2, longitude2)
    

    https://gis.stackexchange.com/questions/88484/excel-distance-calculation

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多