PyOsmium 입문

5843 단어 OpenStreetMap

PyOsmium이란?



PyOsmium은 osmium이라는 라이브러리를 파이썬에서 사용할 수있게하는 모듈입니다.
Osmium은 노드, 웨이, 관계, 변경 세트 등 광범위하게 지원합니다. 변경 파일 및 전체 기록 파일을 포함하여 XML, OSM 및 PBF 형식을 읽고 쓸 수 있습니다.

설치


pip install osmium

osm의 주요 데이터 유형



Node



위도와 경도를 지정하여 지점을 나타냅니다. 신호나 벤치 등의 물체의 지점을 나타내는데 자주 사용됩니다.
<node id="190137966" visible="true" version="11" changeset="60251867" timestamp="2018-06-28T14:59:36Z" user="Miyajimarumo" uid="6336964" lat="35.7208610" lon="139.4069943">
  <tag k="highway" v="traffic_signals"/>
  <tag k="name" v="砂川五差路"/>
</node>

Way



노드의 집합이며, 길과 강을 나타내는 데 사용됩니다. 또한 way로 닫힌 도형을 그리면 건물 등의 다각형도 나타낼 수 있습니다.
<way id="81791723" visible="true" version="4" changeset="26246450" timestamp="2014-10-22T01:06:11Z" user="txma25918" uid="955553">
  <nd ref="1339636471"/>
  <nd ref="952845077"/>
  <nd ref="3142965192"/>
  <nd ref="952845075"/>
  <tag k="highway" v="unclassified"/>
 </way>

Relation



노드, 웨이 등의 멤버를 가져, 안쪽에 있는지, 외측에 있는지 등의 관계성을 나타냅니다. 관계의 의미는 태그에 의해 정의됩니다. (Route, Multipolygon 등)
<relation id="9734761" visible="true" version="2" changeset="73377379" timestamp="2019-08-15T11:22:37Z" user="8dirfriend" uid="3315483">
  <member type="way" ref="700632231" role="outer"/>
  <member type="way" ref="700632232" role="inner"/>
  <tag k="amenity" v="public_bath"/>
  <tag k="building" v="yes"/>
  <tag k="name" v="昭島温泉;湯楽の里"/>
  <tag k="type" v="multipolygon"/>
</relation>

태그



태그는 "키"와 "값"이라는 두 가지 항목으로 구성됩니다. 태그는 맵의 요소(노드, 웨이, 관계) 및 변경 세트에 대한 특정 피처와 특징을 설명합니다. 둘 다 자유로운 형식의 문자열 필드이지만 숫자와 다른 구조적 항목을 나타낼 수도 있습니다.
<tag k="highway" v="unclassified"/>

사용할 파일 다운로드



geofabrik이라는 osm의 데이터를 다루기 쉽게 가공해 주는 사이트의 파일을 사용합니다.
h tps : // 어쨌든 d. 게오후비 k. 에 / 아시아 / 자판. HTML

이 중에서 사용하려는 지역의 데이터를 다운로드합니다.

데이터 추출



위의 데이터를 pyosmium을 사용하여 추출해 보겠습니다.
import osmium
class CafeHandler(osmium.SimpleHandler):
    def __init__(self):
        super(CafeHandler, self).__init__()
        self.cafes = []

    def node(self, o):
       if o.tags.get('amenity') == 'cafe' and 'name' in o.tags: #o.tags.get(key)==value
            self.cafes.append(o.tags['name'])


h = CafeHandler()
h.apply_file('./shikoku-latest.osm.pbf')

print(sorted(h.cafes))
print(len(h.cafes))

실행 결과
[,,,'サンマルクカフェ', 'サンマルクカフェ 丸亀VASALA店', 'サンマルクカフェ 愛媛県立中央病院店', 'シモノロ食堂', 'シモノロ食堂', 'シャラの樹Ⅱ', 'ジャンキーノンキー', 'スターバックス', 'スターバックスカフェ', 'スターバックスコーヒー 松山中央店', 'スターバックスコーヒー 高松天満屋店', 'スプーン', 'ドリマの上', 'ドーム', 'ヒース', 'ピアノカフェルフラン', 'ピエロ', 'ピノキオ', 'ファンキータイム', 'ファンキータイム', 'フレンド', 'プチ・マドンナ', 'プランタン', 'ミスタードーナツ', 'ミント', 'メフィストフェレス', 'モンパリ', 'モンブラン', 'リーサ', '三日月とカフェ', '井戸端処ぼっこ', '六実庵', '友浦サイト', '古阿羅', '喫茶MOCA珈琲店', '喫茶スマイル',,,]
157

위의 예에서는 osm에 나열된 시코쿠 카페의 이름을 추출하고 그 수를 계산했습니다.
import osmium
class RailHandler(osmium.SimpleHandler):
    def __init__(self):
        super(RailHandler, self).__init__()
        self.rails = []

    def way(self, o):
       if o.tags.get('railway') == 'rail' and 'name' in o.tags: #o.tags.get(key)==value
            self.rails.append(o.tags['name'])


h = RailHandler()
h.apply_file('./shikoku-latest.osm.pbf')

print(set(h.rails))

실행 결과
{'郡中線', 'JR土讃線 伊予川橋梁', 'JR土讃線;穂岐山トンネル', 'JR本四備讃線', '土佐くろしお鉄道宿毛線', 'JR土讃線', 'JR鳴門線', 'JR内子線;JR予讃線', '中尾トンネル', 'JR土讃線;大杉トンネル', '高浜線', '横河原線', 'JR徳島線', 'JR土讃線 第一吉野川橋梁', 'JR高徳線', '伊予鉄道高浜線', 'JR予讃線', '高松琴平電気鉄道長尾線', '打除鉄橋', 'línea JR Kotoku', '土佐くろしお鉄道阿佐線', '阿佐海岸鉄道阿佐東線', '大王製紙専用線', 'JR予土線', 'JR内子線', '琴平線', '高松琴平電気鉄道志度線', '吉野川橋梁', '土佐くろしお鉄道中村線', '本四備讃線', 'JR牟岐線', '鳥越トンネル', '鉱山観光鉄道', '高松琴平電気鉄道琴平線', '予讃線'}

이와 같이 태그의 키와 값을 지정하여 원하는 정보를 추출할 수 있습니다.

마지막으로



pyosmium은 이 외에도 way의 길이를 계산하거나 다양한 수 있습니다. 흥미가 솟은 분은 꼭 사용해보세요.

이상이 됩니다.
끝까지 봐 주셔서 감사합니다.

참고문헌



h tps : // / sm 여기에. 오 rg / ぃ 보 s 미우 m /
h tps:///ぉ응ゔ아아. 기주 b. 이오 / 게오 py 17

좋은 웹페이지 즐겨찾기