2

以前、「OpenStreetMap データから交差点のリストを見つけるにはどうすればよいですか?」という質問をしました。<way>以前の質問への回答に基づいて、2 つ以上の によって共有されているノードを検索する、以前の投稿のコードを修正しました。現在は (ほぼ) 機能しており、交差点の座標を収集できます。(<way>複数の によって共有されているノードを見つけるために、タグ属性「primary」、「secondary」、「residential」、または「tertiary」を持つのみを使用して<way>、問題を解決しました<way>。タグ属性「建物」)

私が今直面している問題は、私が収集した交点の座標が網羅的ではないということです。これが OpenStreetMap データの制限によるものなのか、それとも私のコードがまだめちゃくちゃなのか、私にはわかりません。次の画像をご覧ください。

マップ上のピンは、交差点の緯度/経度座標を示します。 一部の交差点が見落とされています。

Google マップのピンは、OpenStreeMap から収集された交差点の緯度/経度座標を示します。配置されたピンは交差点に正しく配置されていますが、私が使用した手法では、同じ図の赤い矢印で示されている交差点など、いくつかの交差点を見つけることができませんでした。

これらの座標を取得するために使用した osm ファイル (xml ファイル) は次のとおりです: https://dl.dropboxusercontent.com/u/1047998/WashingtonDC.osm (このファイルはドロップボックスのパブリック フォルダーにあります。 )

データをスクレイピングするために使用したコードは次のとおりです。

def get_intersections(self, osm, input_type='file'):
    """
    This method reads the passed osm file (xml) and finds intersections (nodes that are shared by two or more roads)

    :param osm: An osm file or a string from get_osm()
    """
    intersection_coordinates = []
    if input_type == 'file':
        tree = ET.parse(osm)
        root = tree.getroot()
        children = root.getchildren()
    elif input_type == 'str':
        tree = ET.fromstring(osm)
        children = tree.getchildren()

    counter = {}
    for child in children:
        if child.tag == 'way':
            # Check if the way represents a "highway (road)"
            # If the way that we are focusing right now is not a road,
            # continue without checking any nodes
            road = False
            road_types = ('primary', 'secondary', 'residential', 'tertiary', 'service') 
            for item in child:
                if item.tag == 'tag' and item.attrib['k'] == 'highway' and item.attrib['v'] in road_types: 
                    road = True

            if not road:
                continue

            for item in child:
                if item.tag == 'nd':
                    nd_ref = item.attrib['ref']
                    if not nd_ref in counter:
                        counter[nd_ref] = 0
                    counter[nd_ref] += 1

    # Find nodes that are shared with more than one way, which
    # might correspond to intersections
    intersections = filter(lambda x: counter[x] > 1,  counter)


    # Extract intersection coordinates
    # You can plot the result using this url.
    # http://www.darrinward.com/lat-long/
    for child in children:
        if child.tag == 'node' and child.attrib['id'] in intersections:
            coordinate = child.attrib['lat'] + ',' + child.attrib['lon']
            intersection_coordinates.append(coordinate)
    return intersection_coordinates

コメント、提案、解決策をいただければ幸いです。また、交差点座標を収集する他の方法を提案していただければ幸いです。

4

0 に答える 0