Slide 1

Slide 1 text

GeoJsonを効率的に取得しよう 2024/8/24 .NETラボ 2024年8⽉ 当⽇LT NTTテクノクロス 中島進也(なかしょ)

Slide 2

Slide 2 text

⾃⼰紹介 • なかしょ(中島進也) @nakasho_dev • 所属:NTTテクノクロス株式会社 デジタルトランスフォーメーション事業部 • 業務:MaaS関連のスマートフォンアプリ開発担当 • 趣味: Ø妻とモンハンデート ØIT関連の勉強会(主にモバイル系 or アジャイル系) Ø技術コミュニティの運営スタッフ üeXtreme Programming Japan User Group(XPJUG) 2019〜 üTDD BootCamp Online (TDDBC) 2020〜 ※本資料は私個⼈の意⾒であり、所属企業・部⾨⾒解を代表するものではありません。

Slide 3

Slide 3 text

https://xpjug.connpass.com/event/326033/

Slide 4

Slide 4 text

4 GeoJSON 地理空間情報を扱うJSONフォーマット • Feature ØGeometry üPoint, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon ØProperties ü属性情報をKey-Valueで持つ üGeoJSONに対応したSDKによっては特定のKeyを⾃動で解釈できる

Slide 5

Slide 5 text

5 https://www.geospatial.jp/ckan/dataset/ksj-p29-13 { "type": "Feature", "properties": { "⾏政区域コード": "13112", "公共施設⼤分類": "16", "公共施設⼩分類": "16001", "学校分類": "16001", "名称": "太⼦堂⼩学校", "所在地": "太⼦堂5-7-4", "管理者コード": 3.0 }, "geometry": { "type": "Point", "coordinates": [ 139.666776, 35.646405 ] } } G空間情報センターで無料で配布 されている国⼟数値情報(学 校)ー東京都を使⽤。

Slide 6

Slide 6 text

6 https://www.geospatial.jp/ckan/dataset/

Slide 7

Slide 7 text

全GeoJSONデータを毎回取得していたら リソースがもったいない 7 表⽰している地図の範囲だけデータ を取得したい。

Slide 8

Slide 8 text

2点間の距離を求める関数を使う 8 • GIS(地理情報システム)をサポートするDBMSにはだいたいある • Azure SQL Database ØSTDistance • Azure Cosmos DB ØST_Distance • Azure AI Search Øgeo.distance 今回はこれで 試すよ

Slide 9

Slide 9 text

9 データエクスプローラーか らのアップロードは、 JSONファイル1つにつき1 Itemとして扱われる。 ある地点から特定の距離の Itemを検索したい時に、⼀ つのItemに複数の地点情報 が含まれていると上⼿くい かない。

Slide 10

Slide 10 text

1件ずつItemとして登録 10 public GeoJsonToCosmosDB() { this.cosmosClient = new CosmosClient(endpointUri, primaryKey); this.database = cosmosClient.GetDatabase(databaseId); this.container = database.GetContainer(containerId); } public async Task UploadGeoJsonAsync(string filePath) { string geoJsonContent = File.ReadAllText(filePath); JObject geoJson = JObject.Parse(geoJsonContent); foreach (var feature in geoJson["features"]) { feature["id"] = Guid.NewGuid().ToString(); var partitionKey = feature["type"]; await this.container.CreateItemAsync(feature, new PartitionKey(partitionKey.ToString())); } } public static async Task Main(string[] args) { GeoJsonToCosmosDB uploader = new GeoJsonToCosmosDB(); string filePath = @"c:¥temp¥p29-13_13.geojson"; await uploader.UploadGeoJsonAsync(filePath); Console.WriteLine("GeoJSON data has been uploaded to CosmosDB."); }

Slide 11

Slide 11 text

11

Slide 12

Slide 12 text

12 ⽥町駅の緯度 経度 2000件以上ある データから16件抽出

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

まとめ 15 • GeoJSONを使⽤すると地図を豊かにできる • G空間情報センターで様々なGeoJSONが提供されている • 緯度経度を元に、必要なデータのみ取得するようにしよう

Slide 16

Slide 16 text

ご清聴ありがとうございました。 16