Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PLATEAUをCityJSONにしてみた

 PLATEAUをCityJSONにしてみた

Avatar for ShoYoneda

ShoYoneda

June 19, 2024
Tweet

More Decks by ShoYoneda

Other Decks in Technology

Transcript

  1. )PMMPX#ZUF--$୅ද ถా ক • Կऀʁ • 8FC԰ • ఺܈԰ •

    σʔλ԰ • ͍ΖΜͳσʔλΛूΊ͍ͯͬͯ͡ ༡Ϳͷ͕झຯ • σʔλม׵ܥͷϓϩάϥϜॻ͘͜ͱ͕ଟ͍ HollowByte LLC 2 ࣗݾ঺հ こいつ👉
  2. HollowByte LLC 4 8FCͰ$JUZ(.-Λॲཧ͢Δʹ͸ const xmlString = ` <CityModel xmlns="http://www.opengis.net/citygml/2.0"

    </CityModel>`; // XMLをパースする const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlString, "application/xml"); // 名前空間リゾルバ function nsResolver(prefix) { const ns = { 'gml': 'http://www.opengis.net/gml', 'bldg': 'http://www.opengis.net/citygml/building/2.0' }; return ns[prefix] || null; } // XPathを使⽤して "bldg:measuredHeight" を抽出する const heights = []; const nodesSnapshot = xmlDoc.evaluate('//bldg:measuredHeight', xmlDoc, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (let i = 0; i < nodesSnapshot.snapshotLength; i++) { heights.push(nodesSnapshot.snapshotItem(i).textContent); } console.log(heights); // ["10", "20"] こいつ👉 PLATEAUくらい情報量があると XPathの処理が爆発する
  3. • %౎ࢢϞσϧΛ֨ೲ͢ΔͨΊͷ+40/ϕʔεͷϑΥʔϚοτ • $JUZ+40/ W͸Φʔϓϯ஍ཧۭؒίϯιʔγΞϜ 0($ ͷެࣜඪ४ • ͍ΘΏΔ$JUZ(.-ͷ+40/ͷ൛ •

    +40/ϕʔεͳͷͰϓϩάϥϜతʹѻ͍΍͍͢ • $JUZ(.-ΑΓ΋ܰྔ • ฏۉഒίϯύΫτ • $JUZ(.- .# • $JUZ+40/ .# HollowByte LLC 6 $JUZ+40/ͱ͸ͳΜͧ΍
  4. 属性 GeoJSON CityJSON ⽬的と⽤途 簡単な地理空間データの表現と共有。主 にウェブマッピングアプリケーションや 軽量なデータ交換に使⽤。 CityGMLでエンコードされた都市モデルデータの効 率的な表現。詳細な3D都市モデルの共有と解析に 適⽤。

    データモデル ポイント、ラインストリング、ポリゴン などの基本的な地理空間オブジェクトを 表現。複雑な3Dモデルには不適。 建物、道路、橋梁、トンネルなどの詳細な3D都市 オブジェクトを表現。複雑なジオメトリと属性情 報を持つ。 構造 フィーチャコレクションとしてデータを 格納。各フィーチャはジオメトリとプロ パティを持つ。 CityObjectsとして都市モデルデータを格納。各 CityObjectはジオメトリと属性を持つ。 互換性 広くサポートされており、ほとんどの GISツールやウェブマッピングライブラ リで使⽤。 CityGMLデータのエンコードに特化。主に3D都市 モデルの解析と共有に使⽤。GeoJSONほどの広範 なツールサポートはないが、3D都市モデル分野で は重要。 HollowByte LLC 7 (FP+40/ͱͷҧ͍͸ͳΜ΍ͶΜ CityJSONはGeoJSONより複雑な情報を扱うことを⽬的としている
  5. CityGML CityJSON function extractAttributesFromCityGML(xmlData, tagName) { const parser = new

    DOMParser(); const xmlDoc = parser.parseFromString(xmlData, 'application/xml'); const buildings = xmlDoc.getElementsByTagName('bldg:Building'); const result = []; for (let i = 0; i < buildings.length; i++) { const building = buildings[i]; const id = building.getAttribute('gml:id'); const tagElements = building.getElementsByTagName(tagName); if (tagElements.length > 0) { const value = tagElements[0].textContent; result.push({ id: id, [tagName]: value }); } } return result; } function extractAttributes(cityjson, attributeName) { const result = []; for (const id in cityjson.CityObjects) { const cityObject = cityjson.CityObjects[id]; if (cityObject.attributes[attributeName] !== undefined) { result.push({id: id, attribute: cityObject.attributes[attributeName] }); } } return result; } HollowByte LLC 9 ѻ͏ίʔυྔʢ+BWB4DSJQUʣ 特定の属性を抽出する関数のコード量⽐較 11⾏ 16⾏