2012年9月3日 星期一

取經/緯度裡n公里裡的景點

孟諺同事提供的經/緯度運算如下:
赤道圓周=40,075.017km = 40075017m
兩極圓周=40,007.860km = 40007860m


但是因為我們的距離是 500m ~ 5000m,弧度影響甚小.所以可視為地球是平面.

360 經度 = 40075017 m ---> 每1m 為 0.000008983152770715 經度, 取10位 =0.0000089832
360 緯度 = 40007860 m ---> 每1m 為 0.000008998231847442 緯度, 取10位 =0.0000089982

因為台灣不會跨0, 直接加減就好了.

孟諺是建議型別使用: decimal(10,7)
我覺得, 其實也可以開到 decimal(18,8)

孟諺給的範例 SQL 如下:

SELECT *
FROM dbo.旅館座標表格
WHERE (經度 BETWEEN @基本經度 - @經度差距 AND @基本經度 + @經度差距)
AND (緯度 BETWEEN @基本緯度 - @緯度差距 AND @基本緯度 + @緯度差距)



我的情況是, 要把旅館(HotelInfo) 坐標的3.5公里裡的景點(RouteDetail) 資料取出來, 放到一個 路線(RouteMain) 和 旅館(HotelInfo) 的Mapping對應表(RouteHotel) 中.
insert into RouteHotel(RID,HotelInfoID)
SELECT distinct M.RID, H.hotelInfoID
FROM RouteMain M
inner join RouteDetail D on M.RID = D.RID
inner join HotelInfo H
on (D.DetailLongitude BETWEEN H.HotelLongitude - (0.0000089832 * 3500) AND H.HotelLongitude+ (0.0000089832 * 3500))
and (D.DetailLatitude BETWEEN H.HotelLatitude - (0.0000089832 * 3500) AND H.HotelLatitude + (0.0000089832 * 3500))


附上, 百大路線 + HotelInfo mapping Table schema.
CREATE TABLE [dbo].[RouteHotel](
    [RHID] [int] IDENTITY(1,1) NOT NULL,
    [RID] [int] NOT NULL,
    [HotelInfoID] [int] NOT NULL
 CONSTRAINT [PK_RouteHotel] PRIMARY KEY CLUSTERED
(
    [RID] ASC, [HotelInfoID] ASC
)
) ON [PRIMARY]


沒有留言:

張貼留言

Facebook 留言板