以前、「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
コメント、提案、解決策をいただければ幸いです。また、交差点座標を収集する他の方法を提案していただければ幸いです。