s********e 发帖数: 893 | 1 有没有人用过google map api来计算两个地址之间的距离。我现在在做的一个东西是输
入一个大学的名称,然后把这个大学地址周围10个mile的公寓都返回。公寓和大学的地
址都存在了一个数据库里了可以调用。问题是不知道google map api的速度如何?会不
会输入一个地址search后好久才能返回?当然这肯定也与访问公寓地址的数据库的速度
有关。我现在想做的是有没有必要把每所大学周围10mile的所有公寓地址都在线后计算
好存到数据库里,当用户实时在线输入这个大学地址时,并没有直接实时去计算距离,
而实际上是去访问已经计算好的那个数据库了。不知道有没有这个必要。有用过的请指
教。多谢了先。 | s*********e 发帖数: 4475 | 2 显然先算好速度快得多。
【在 s********e 的大作中提到】 : 有没有人用过google map api来计算两个地址之间的距离。我现在在做的一个东西是输 : 入一个大学的名称,然后把这个大学地址周围10个mile的公寓都返回。公寓和大学的地 : 址都存在了一个数据库里了可以调用。问题是不知道google map api的速度如何?会不 : 会输入一个地址search后好久才能返回?当然这肯定也与访问公寓地址的数据库的速度 : 有关。我现在想做的是有没有必要把每所大学周围10mile的所有公寓地址都在线后计算 : 好存到数据库里,当用户实时在线输入这个大学地址时,并没有直接实时去计算距离, : 而实际上是去访问已经计算好的那个数据库了。不知道有没有这个必要。有用过的请指 : 教。多谢了先。
| h*****s 发帖数: 114 | 3 实时查google map API有局限:速度问题,访问次数限制问题
基于location搜索现在是很普遍的了,一般做法是:
step 1,根据地址用google map api反查出经纬度,然后保存到自己数据库或者其他数
据源
step 2, 按照不用距离,通过经纬度之间数学运算就可以找到满足条件的地址了,这时
候已经脱离google map api了
如果你用SQL Server,下面一个Function可以使用,其他DB的话,自己转化
CREATE FUNCTION [dbo].[GetDistanceBetweenTwoPoint](
@lat1 FLOAT,
@long1 FLOAT,
@lat2 FLOAT,
@long2 FLOAT)
RETURNS FLOAT
AS
BEGIN
DECLARE @DegToRad AS FLOAT
DECLARE @Ans AS FLOAT
DECLARE @Miles AS FLOAT
SET @DegToRad = 57.29577951
SET @Ans = 0
SET @Miles = 0
IF @lat1 IS NULL
OR @lat1 = 0
OR @long1 IS NULL
OR @long1 = 0
OR @lat2 IS NULL
OR @lat2 = 0
OR @long2 IS NULL
OR @long2 = 0
BEGIN
RETURN ( @Miles )
END
SET @Ans = Sin(@lat1 / @DegToRad) * Sin(@lat2 / @DegToRad) +
Cos(@lat1 / @DegToRad) * Cos(@lat2 / @DegToRad) *
Cos(Abs(@long2 - @long1) / @DegToRad)
SET @Miles = 3959 * Atan(Sqrt(1 - Square(@Ans)) / @Ans)
SET @Miles = round(@Miles,2)
RETURN ( @Miles )
END
GO | b********2 发帖数: 855 | 4 楼上的正解,赞一个。
【在 h*****s 的大作中提到】 : 实时查google map API有局限:速度问题,访问次数限制问题 : 基于location搜索现在是很普遍的了,一般做法是: : step 1,根据地址用google map api反查出经纬度,然后保存到自己数据库或者其他数 : 据源 : step 2, 按照不用距离,通过经纬度之间数学运算就可以找到满足条件的地址了,这时 : 候已经脱离google map api了 : 如果你用SQL Server,下面一个Function可以使用,其他DB的话,自己转化 : CREATE FUNCTION [dbo].[GetDistanceBetweenTwoPoint]( : @lat1 FLOAT, : @long1 FLOAT,
| s********e 发帖数: 893 | 5 多谢hivegas 详细答复。准备就按照你说的方法做了。 | B*D 发帖数: 5016 | 6 好像有的zip数据库就带有经度纬度,可以根据距离把某个半径内的zipcode
都列出来,然后再用结果去filter 你的旅馆啥的地址数据库,结果应该就是你想要的
了?
我hijack楼主这个帖子一下
关于计算driving distance(非 air mile)
我找到这个似乎很不错
http://www.falconsolution.com/driving-distance-calculator/
是基于zip数据库的,我问他们是怎么计算driving distance的
对方是这样回答的
Our calculator are not based on Google API services. You will get a database
(MySQL or MS access) with distances between US zip codes. On this database w
e saved distances like a graph and not like records (from_zipcode,to_zipcode
,distance). For this reason you have to use our php/asp scripts to read data
base saved graph. You cannot run simple sql select query.
我觉得这个数据库不依赖外部,而且结果基本准确,速度好像不错
就是不太理解啥叫作save distance like a graph
【在 h*****s 的大作中提到】 : 实时查google map API有局限:速度问题,访问次数限制问题 : 基于location搜索现在是很普遍的了,一般做法是: : step 1,根据地址用google map api反查出经纬度,然后保存到自己数据库或者其他数 : 据源 : step 2, 按照不用距离,通过经纬度之间数学运算就可以找到满足条件的地址了,这时 : 候已经脱离google map api了 : 如果你用SQL Server,下面一个Function可以使用,其他DB的话,自己转化 : CREATE FUNCTION [dbo].[GetDistanceBetweenTwoPoint]( : @lat1 FLOAT, : @long1 FLOAT,
| s********e 发帖数: 893 | 7 多谢BJD补充。
我来试着解释一下啥叫save distance like a graph。Graph是离散数学里的一个概念
,学计算机的应该都多少接触过图论。比方说有5个城市,有的城市是直接相连的,有
的不是。那数据存放时,可以5个城市(结点)存一个array里。每个城市和它邻接的城
市和距离也存在一个array里。比如5个城市V=(A,B,C,D,E). 距离存放在E={(A,B,150),
(A,D,200), (D,E,100)...}. 现在你想计算从A到E,有可能有多种path,有多种
算法来计算哪个最短。那个著名的Travelling salesman problem就是解决这个问题的
。常见的有基因算法,模拟熄火等,还有路由器里用的Dijkstra's algorithm。你说的
这个人估计就是用的这个原理。也就是他说的不是随便run 一个sql query就能解决的
,因为数据不是按照关系型数据库的方式来存放的。 | B*D 发帖数: 5016 | 8 恩,那么这样的数据库
在10-15用户并发访问的情况下,对服务器要求高么?
或者说并发性如何?
),
【在 s********e 的大作中提到】 : 多谢BJD补充。 : 我来试着解释一下啥叫save distance like a graph。Graph是离散数学里的一个概念 : ,学计算机的应该都多少接触过图论。比方说有5个城市,有的城市是直接相连的,有 : 的不是。那数据存放时,可以5个城市(结点)存一个array里。每个城市和它邻接的城 : 市和距离也存在一个array里。比如5个城市V=(A,B,C,D,E). 距离存放在E={(A,B,150), : (A,D,200), (D,E,100)...}. 现在你想计算从A到E,有可能有多种path,有多种 : 算法来计算哪个最短。那个著名的Travelling salesman problem就是解决这个问题的 : 。常见的有基因算法,模拟熄火等,还有路由器里用的Dijkstra's algorithm。你说的 : 这个人估计就是用的这个原理。也就是他说的不是随便run 一个sql query就能解决的 : ,因为数据不是按照关系型数据库的方式来存放的。
| t****o 发帖数: 44 | 9 "save distance like a graph"
根据对他网站的观察我有几点猜测:
1. 地图可以理解成一个 graph, 关于怎么表示这张图, 你可以查下 directed
acyclic graph
2. 有一种表示方式是用tree structure来表示, 然后在数据库里存每一段距离
3. 你可以参考他网站上的"mileage chart"来猜一下他可能的存储方式.
你询价了吗? 能不能悄悄透露一下他们的价格, 多谢了.
| B*D 发帖数: 5016 | 10 他网站说买这个数据库和对应API
好像才149usd?
【在 t****o 的大作中提到】 : "save distance like a graph" : 根据对他网站的观察我有几点猜测: : 1. 地图可以理解成一个 graph, 关于怎么表示这张图, 你可以查下 directed : acyclic graph : 2. 有一种表示方式是用tree structure来表示, 然后在数据库里存每一段距离 : 3. 你可以参考他网站上的"mileage chart"来猜一下他可能的存储方式. : 你询价了吗? 能不能悄悄透露一下他们的价格, 多谢了. :
| t****o 发帖数: 44 | 11 谢谢分享. 你要是不差钱的话就买一个看看呗. 要是觉得上当了别骂我啊.
下面是我的估计,
1. 他有可能给你一个pre-calculated database,
2. 全美约有30K多个zipcode, 交叉乘一下应该有500million条记录. 按说照(from_zip
, to_zip, distance)来存的话, 应该查询最快啊. 现在我也不明白他的"save
distance like a graph"是怎么回事了.
3. 3楼hivegas对楼主是正解, 对你的driving distance就不合适. falcon家的你近中
远距离都测试过了吗? 我觉得他有可能是按genpichong提到的乘一个因子, 只不过这个
因子是个变量.
就想起这么多了. |
|