Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#28 add MvtTileParser and bump 0.0.5 #30

Merged
merged 1 commit into from
Aug 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ This is a collection of utilities for the `Plateau <https://www.mlit.go.jp/plate
>>> result = parser.download_and_parse("https://assets.cms.plateau.reearth.io/assets/d6/70821e-7f58-4f69-bc34-341875704e78/40203_kurume-shi_2020_citygml_3_op.zip", "/tmp")
>>> result
[{'gid': 'bldg_383f1804-aa34-4634-949f-f769e09fa92d', 'center': [130.41263587199947, 33.22489181671553], 'min_height': 3.805999994277954, 'measured_height': 9.3, 'building_structure_type': '非木造'}, {'gid': 'bldg_877dea60-35d0-4fd9-8b02-852e39c75d81', 'center': [130.41619367090038, 33.22492719812357], 'min_height': 4.454999923706055, 'measured_height': 3.0, 'building_structure_type': '非木造'},...]
>>> from plateauutils.parser.mvt_tile_parser import MvtTileParser
>>> target_polygon = from_wkt("POLYGON ((130.525689 33.323966, 130.522728 33.314069, 130.511441 33.308653, 130.501013 33.30937, 130.492516 33.318516, 130.493717 33.325831, 130.504618 33.332249, 130.512857 33.332213, 130.525689 33.323966))")
>>> parser = MvtTileParser(target_polygon)
>>> result = parser.download_and_parse("https://assets.cms.plateau.reearth.io/assets/43/53a0e1-cc14-4228-a5ef-19333a23596d/40203_kurume-shi_2020_3dtiles-mvt_3_op.zip", "/tmp")
>>> result
['/tmp/40203_kurume-shi_2020_3dtiles-mvt_3_op/luse/15/28254/13174.mvt']

How to develop
--------------
Expand Down
6 changes: 5 additions & 1 deletion doc/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,11 @@ Usage
>>> result = parser.download_and_parse("https://assets.cms.plateau.reearth.io/assets/d6/70821e-7f58-4f69-bc34-341875704e78/40203_kurume-shi_2020_citygml_3_op.zip", "/tmp")
>>> result
[{'gid': 'bldg_383f1804-aa34-4634-949f-f769e09fa92d', 'center': [130.41263587199947, 33.22489181671553], 'min_height': 3.805999994277954, 'measured_height': 9.3, 'building_structure_type': '非木造'}, {'gid': 'bldg_877dea60-35d0-4fd9-8b02-852e39c75d81', 'center': [130.41619367090038, 33.22492719812357], 'min_height': 4.454999923706055, 'measured_height': 3.0, 'building_structure_type': '非木造'},...]

>>> from plateauutils.parser.mvt_tile_parser import MvtTileParser
>>> parser = MvtTileParser(target_polygon)
>>> result = parser.download_and_parse("https://assets.cms.plateau.reearth.io/assets/43/53a0e1-cc14-4228-a5ef-19333a23596d/40203_kurume-shi_2020_3dtiles-mvt_3_op.zip", "/tmp")
>>> result
['/tmp/40203_kurume-shi_2020_3dtiles-mvt_3_op/luse/15/28254/13174.mvt']

.. toctree::
:maxdepth: 2
Expand Down
88 changes: 88 additions & 0 deletions plateauutils/parser/mvt_tile_parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import glob
import os
from plateauutils.abc.plateau_parser import PlateauParser
from plateauutils.tile_list.polygon_to_tile_list import PolygonToTileList
from shapely.geometry import Polygon
import shutil
import zipfile


class MvtTileParser(PlateauParser):
"""MVTタイルをパースするクラス

Parameters
----------
polygon : shapely.geometry.Polygon
対象となるポリゴン
zoom : int
対象とするズームレベル
"""

def __init__(self, polygon: Polygon = None, zoom: int = 15):
self.zoom = zoom
super().__init__(polygon)

def parse(self, target_path: str = "") -> list:
"""MVTタイルをパースして、リストを返すメソッド

Parameters
----------
target_path : str
MVTタイル(zip)のパス

Returns
-------
list
タイルのパスのリスト
"""
# ファイルが存在しないならエラー
if not os.path.exists(target_path):
raise FileNotFoundError(f"target_path: {target_path} is not found")
# zipファイルにターゲットのパスが存在するか確認
hit_targets = []
with zipfile.ZipFile(target_path) as zip_file:
for name in zip_file.namelist():
for target in self.targets:
path = os.path.join("luse", target)
if name.find(path) >= 0:
hit_targets.append(target)
if len(hit_targets) == 0:
raise ValueError(f"target_path: {target_path} is not target")
# zipファイルを解凍する
unarchived_dir = target_path.replace(".zip", "")
shutil.unpack_archive(target_path, unarchived_dir)
# 返り値を作成
return_list = []
# 解凍したファイルをパースする
for target in hit_targets:
# ファイルパスを作成
target_file_path = os.path.join(unarchived_dir, "luse", target)
for file_path in glob.glob(target_file_path):
return_list.append(file_path)
return sorted(return_list)

def download_and_parse(self, url: str = "", target_dir: str = "") -> list:
"""MVTタイルをダウンロードして、タイルのリストを返すメソッド

Parameters
----------
url : str
MVTタイル(zip)のURL
target_dir : str
ファイルを展開する先のパス

Returns
-------
list
タイルのパスのリスト
"""
saved_path = self._download(url, target_dir)
return self.parse(saved_path)

def _target_list(self, polygon: Polygon = None) -> list:
# PolygonがNoneならエラー
if polygon is None:
raise ValueError("polygon is None")
# Polygonからタイルのリストを作成
tile_list = PolygonToTileList(polygon, self.zoom)
return tile_list.output()
36 changes: 36 additions & 0 deletions plateauutils/parser/tests/test_mvt_tile_parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import os
from plateauutils.parser.mvt_tile_parser import MvtTileParser
from shapely import from_wkt
import tempfile


def test_mvt_tile_parser_z15():
test_polygon = from_wkt(
"POLYGON ((130.525689 33.323966, 130.522728 33.314069, 130.511441 33.308653, 130.501013 33.30937, 130.492516 33.318516, 130.493717 33.325831, 130.504618 33.332249, 130.512857 33.332213, 130.525689 33.323966))"
)
parser = MvtTileParser(test_polygon, 15)
with tempfile.TemporaryDirectory() as tmpdir:
result = parser.download_and_parse(
"https://file.smellman.org/test_mvt_list.zip", tmpdir
)
assert len(result) == 13
assert result[0] == os.path.join(
tmpdir, "test_mvt_list/luse/15/28261/13163.mvt"
)
assert result[12] == os.path.join(
tmpdir, "test_mvt_list/luse/15/28264/13165.mvt"
)


def test_mvt_tile_parser_z14():
test_polygon = from_wkt(
"POLYGON ((130.525689 33.323966, 130.522728 33.314069, 130.511441 33.308653, 130.501013 33.30937, 130.492516 33.318516, 130.493717 33.325831, 130.504618 33.332249, 130.512857 33.332213, 130.525689 33.323966))"
)
parser = MvtTileParser(test_polygon, 14)
with tempfile.TemporaryDirectory() as tmpdir:
result = parser.download_and_parse(
"https://file.smellman.org/test_mvt_list.zip", tmpdir
)
assert len(result) == 6
assert result[0] == os.path.join(tmpdir, "test_mvt_list/luse/14/14130/6581.mvt")
assert result[5] == os.path.join(tmpdir, "test_mvt_list/luse/14/14132/6582.mvt")
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ classifiers = [
"Development Status :: 2 - Pre-Alpha",
"Programming Language :: Python :: 3",
]
version = "0.0.4"
version = "0.0.5"
dependencies = [
"click",
"numpy",
Expand Down