2010-06-06 100 views
0

我只是在使用由JOSM生成的我的区域数据集。我使用Osmosis将其移入mySQL DB中,使用0.6 API方案,现在我正在拼命尝试以下操作:OpenStreetMap使用mySQL进行接近搜索

我想获得一个城市的所有街道。 AFAIK OSM数据中没有标记/关系来确定这一点,因此我尝试使用邻近搜索来获取代表城市中心的节点周围半径内的所有节点。

大部分我看着方法here

我什么时候是下面的SQL代码,应该让我的节点周围最近的100个节点ID为36187002和10公里半径范围内。

set @nodeid = 36187002; 
set @dist = 10; 
select longitude, latitude into @mylon, @mylat from nodes where [email protected] limit 1; 


SELECT id, (6371 * acos(cos(radians(@mylon)) * cos(radians(latitude)) * 
cos(radians( longitude) - radians(@mylat)) + sin(radians(@mylon)) * sin(radians(latitude)))) 
AS distance 
FROM nodes HAVING distance < @dist ORDER BY distance LIMIT 0 , 100; 

那么..它不起作用。 :(我猜主要问题是,OSM拉特/隆是乘以10.000.000,我不知道如何纠正这个功能,使其工作。

关于此任何想法?所有的解决方案/替代品是非常欢迎!

回答

0

将数据类型为double(因此三角函数有机会)表示的纬度和经度表格添加额外的列可能会更快 - 您可能想要进一步并预先计算x轴, yaxis和zaxis作为列(再次,存储为double

因此,您的新列是松散的(您可能需要根据需要添加数据类型转换):

XAxis = cos(radians(Latitude/10000000)) * cos(radians(Longitude/10000000)) 
YAxis = cos(radians(Latitude/10000000)) * sin(radians(Longitude/10000000)) 
ZAxis = sin(radians(Latitude/10000000)) 

然后,你接近的搜索变为:

set @nodeid = 36187002; 
set @dist = 10; 
SELECT XAxis, YAxis, ZAxis 
INTO @CntXAxis, @CntYAxis, @CntZAxis 
FROM nodes 
WHERE [email protected] limit 1; 

SELECT id, (6371 * acos(
      CASE 
       WHEN nodes.XAxis * @CntXAxis 
       + nodes.YAxis * @CntYAxis 
       + nodes.ZAxis * @CntZAxis > 1.0 THEN 1.0 
       ELSE nodes.XAxis * @CntXAxis 
       + nodes.YAxis * @CntYAxis 
       + nodes.ZAxis * @CntZAxis 
      END 
      ) AS Distance 
FROM nodes 
HAVING Distance < @dist 
ORDER BY distance LIMIT 0 , 100; 
0

我修改查询了一点,它的工作原理。 这里我的代码:

set @nodeid = 122317; 
    set @dist = 10; 
    select lon, lat into @mylon, @mylat from nodes where [email protected] limit 1; 

    SELECT id, (6371 * acos(
    sin(radians(@mylat)) * sin(radians(lat)) + 
    cos(radians(@mylat)) * cos(radians(lat)) * 
    cos(radians(lon) - radians(@mylon)) 
    )) 
    AS distance 
    FROM nodes having distance <@dist 

从来就得到了来自德国Wikipedia的公式,它工作正常。我有一些ruby代码的拳头,但它也作为一个SQL查询工作。

要选择一些特殊的节点添加此

(select nodes.id,lat,lon,k,v from nodes join node_tags on nodes.id=node_tags.id where k='public_transport') as stations 

为FROM条件指定节点的标签。 (当然,它会在上面的代码中将lat/log访问更改为stations.lat/stations.log。