LRTKレフィクシア株式会社

GeoJSONをTypeScriptで扱う時の型定義と注意点5つ

GeoJSONは、点、線、面などの地理空間情報を扱うための代表的なデータ形式です。Web地図、現地調査、施設管理、台帳管理、施工管理、点検記録など、位置を持つ業務データを扱う場面でよく使われます。一方で、TypeScriptでGeoJSONを扱う場合は、見た目には単純なJSONであっても、型定義の作り方を誤ると、座標の順序違い、Geometryの種類違い、propertiesの不整合、nullの扱い漏れなどが起きやすくなります。

GeoJSONは「JSONとして読めること」と「地理データとして正しく扱えること」が別問題です。TypeScriptの型定義は、入力値の意味を完全に保証するものではありませんが、開発中に不整合を早く見つけるための重要な手掛かりになります。特に実務では、現場で取得した位置情報、管理番号、属性情報、更新日時、担当区分などをGeoJSONに紐づけることが多いため、単に座標だけを型にするのではなく、業務データ全体として扱いやすい型設計が必要です。

GeoJSONの基本構造をTypeScriptの型として整理する

GeoJSONをTypeScriptで扱うときは、まずGeoJSONの基本構造を分解して理解することが大切です。GeoJSONには、Geometry、Feature、FeatureCollectionという考え方があります。Geometryは点や線や面そのものを表し、FeatureはGeometryに属性情報を付けたものを表し、FeatureCollectionは複数のFeatureをまとめたものを表します。

実務でよく扱うのはFeatureCollectionです。たとえば、現地調査で取得した複数の地点、道路沿いの点検箇所、区域ポリゴン、施工範囲、管理対象物の位置などを一つのファイルとして受け渡す場合、多くはFeatureCollectionの形になります。ただし、データの一部を処理する関数ではFeature単位で扱うこともありますし、図形だけを計算対象にする場合はGeometryだけを扱うこともあります。そのため、TypeScriptの型定義では、これらを混ぜずに分けて考えると扱いやすくなります。

GeoJSONの基本は、typeという文字列によってデータの種類を判別する構造です。FeatureであればtypeはFeature、FeatureCollectionであればtypeはFeatureCollectionになります。Geometryでも、Point、LineString、Polygonなどの種類がtypeで示されます。TypeScriptでは、このtypeを文字列リテラル型として定義することで、条件分岐の中で型を絞り込みやすくなります。

Featureを処理する関数で、入力値のtypeがFeatureであることを前提にすれば、geometryとpropertiesを持つデータとして扱えます。FeatureCollectionであればfeaturesという配列を持つデータとして扱えます。ここを単なるanyや広すぎるobjectで処理してしまうと、実装中にpropertiesのつづりを間違えたり、featuresが存在しないデータを配列として処理したりしても、型の段階では気づきにくくなります。

基本型の考え方は、次のように整理できます。

`ts type Position = [number, number] | [number, number, number];

type Geometry = | PointGeometry | LineStringGeometry | PolygonGeometry | MultiPointGeometry | MultiLineStringGeometry | MultiPolygonGeometry | GeometryCollectionGeometry;

type PointGeometry = { type: "Point"; coordinates: Position; };

type LineStringGeometry = { type: "LineString"; coordinates: Position[]; };

type PolygonGeometry = { type: "Polygon"; coordinates: Position[][]; };

type MultiPointGeometry = { type: "MultiPoint"; coordinates: Position[]; };

type MultiLineStringGeometry = { type: "MultiLineString"; coordinates: Position[][]; };

type MultiPolygonGeometry = { type: "MultiPolygon"; coordinates: Position[][][]; };

type GeometryCollectionGeometry = { type: "GeometryCollection"; geometries: Geometry[]; };

type Feature<P = Record<string, unknown>> = { type: "Feature"; geometry: Geometry | null; properties: P | null; };

type FeatureCollection<P = Record<string, unknown>> = { type: "FeatureCollection"; features: Feature[]; }; `

このように、FeatureやFeatureCollectionに型引数を持たせておくと、propertiesの内容を案件や用途に合わせて差し替えられます。たとえば、点検対象物のデータであれば、管理番号、名称、点検日、状態区分などをpropertiesに持たせることができます。施工範囲のデータであれば、工区名、施工種別、予定日、進捗区分などを持たせることもできます。

重要なのは、GeoJSONの型を一つの巨大な型として捉えるのではなく、Geometry、Feature、FeatureCollection、propertiesを分けて定義することです。分けておけば、関数の責務も明確になります。地図表示用の関数はFeatureCollectionを受け取る、面積や延長の計算用の関数はGeometryを受け取る、一覧表示用の関数はpropertiesを受け取る、といった設計にしやすくなります。

また、Featureのgeometryはnullになる可能性がある点にも注意が必要です。実務上はgeometryが必ず入っている前提でデータを作ることが多いですが、形式としてはgeometryにnullを許す場面があります。propertiesも形式上はnullになり得ます。自社の業務データとしてpropertiesを必須にしたい場合でも、外部から受け取る段階ではnullを想定し、検証後に内部用の型へ変換する設計が安全です。

TypeScriptの型定義は、データの構造を読み手に伝える役割もあります。GeoJSONを扱う処理では、ファイル読み込み、座標変換、属性編集、地図表示、出力など、複数の処理がつながることが多くなります。その中で型が曖昧だと、どの時点でどの形のデータが入っているのか分からなくなります。最初に基本構造を型として整理しておくことで、後続の処理を安全に積み上げやすくなります。

Geometryの種類ごとに座標型を分けて定義する

GeoJSONをTypeScriptで扱うときに特に注意したいのが、Geometryの種類ごとにcoordinatesの階層が変わる点です。Pointは一つの座標、LineStringは座標の配列、Polygonは線の配列、MultiPolygonは面の配列というように、同じcoordinatesという名前でも中身の深さが異なります。ここを単にnumber[][][]のように広く定義すると、一見便利に見えますが、後の処理で座標の意味を取り違えやすくなります。

Pointは一つの位置を表します。coordinatesはPositionです。LineStringは複数の位置を順番につないだ線を表すため、coordinatesはPositionの配列です。Polygonは外周線と必要に応じた穴を表すため、coordinatesはPositionの配列をさらに配列にした形になります。MultiPolygonになると、複数のPolygonを持つため、さらに配列の階層が深くなります。

TypeScriptでは、Geometryのtypeとcoordinatesを組み合わせて定義することで、種類に応じた座標構造を表現できます。これにより、typeがPointであることを確認した後はcoordinatesを一つのPositionとして扱えますし、typeがPolygonであればcoordinatesをリングの配列として扱えます。

Geometryのtypeで分岐する処理は、次のように書けます。

`ts function countPositions(geometry: Geometry): number { switch (geometry.type) { case "Point": return 1;

case "LineString":
case "MultiPoint":
  return geometry.coordinates.length;

case "Polygon":
case "MultiLineString":
  return geometry.coordinates.reduce((sum, line) => sum + line.length, 0);

case "MultiPolygon":
  return geometry.coordinates.reduce((sum, polygon) => {
    return sum + polygon.reduce((innerSum, ring) => innerSum + ring.length, 0);
  }, 0);

case "GeometryCollection":
  return geometry.geometries.reduce((sum, item) => sum + countPositions(item), 0);

} } `

この例では、typeごとにcoordinatesの階層が自動的に絞り込まれるため、処理中のデータ構造を読み間違えにくくなります。実務では、座標数の確認、範囲の計算、表示前の簡易検査、不要な空データの除外などで、このような分岐が必要になることがあります。

一方で、Geometryをすべてまとめて処理したい場合もあります。たとえば、全座標を取り出して範囲を求めたい、すべての座標に同じ丸め処理をしたい、標高値を除外したい、といった場面です。この場合でも、内部ではGeometryの種類ごとに階層を正しくたどる必要があります。型を分けておけば、実装時にどの階層を走査すべきかが明確になります。

Positionを[number, number]だけで定義するか、[number, number, number]も許すかは、用途に合わせて決めておく必要があります。現在一般に参照されるGeoJSONの仕様では、座標は少なくとも2つの数値を持ち、3つ目の値は高さや標高に相当する値として扱われることがあります。一方で、4つ以上の要素を独自に追加する運用は、相互利用性を下げるおそれがあるため、通常の業務システムでは2次元または3次元に絞って扱うほうが安全です。

ただし、3値を許す場合でも、その3つ目の値を常に業務上利用できる高さとして信用できるとは限りません。データの作成元や運用ルールによって意味が異なる可能性があるため、TypeScriptの型だけで「これは正しい標高である」とまでは保証できません。高さを業務上の判断に使う場合は、座標の仕様、計測方法、単位、基準面、更新時点などを別途確認する必要があります。

Polygonの扱いにも注意が必要です。Polygonは単に点の配列ではなく、閉じた線を表します。外周線と内側の穴を複数のリングとして持つことがあります。そのため、Polygonを表示や判定に使うときは、coordinatesの最初の要素を外周として扱い、2つ目以降を内側の穴として扱う設計になります。TypeScriptの型ではPosition[][]と表せますが、外周と穴の意味までは型だけでは表現しきれません。実装上は、リングの数、各リングの点数、始点と終点の一致などを検査する処理が必要になります。

LineStringでも、座標が1点しかないデータは線として意味を持ちません。Polygonでも、必要な点数を満たさないデータは面として扱えません。このような幾何としての妥当性は、型定義だけでは防げません。TypeScriptの型は「配列であること」は表現できますが、「線として成立する点数があること」や「面として閉じていること」は別の検証が必要です。

したがって、Geometryの型定義では、まず種類ごとの座標階層を正しく表現し、そのうえで実行時の検証処理を組み合わせる考え方が重要です。型を細かく分ける目的は、開発者がcoordinatesの構造を誤って扱わないようにすることです。さらに、業務データとして正しいかどうかは、入力時や保存前に検査することで補う必要があります。

propertiesは業務データとして型を具体化する

GeoJSONを実務で使う場合、Geometryよりもpropertiesの設計が重要になることがあります。なぜなら、現場や業務で知りたいのは、単に点や線や面の形だけではなく、それが何を表しているのか、どの管理番号に対応するのか、いつ取得したのか、どの状態なのか、誰が確認したのかといった属性情報だからです。

GeoJSONのpropertiesは、自由度の高いオブジェクトとして扱えます。しかし、自由度が高いということは、型を決めずに使うと不整合が起きやすいということでもあります。たとえば、あるFeatureではidという名前、別のFeatureではmanagementIdという名前、さらに別のFeatureでは番号という名前を使っていると、一覧表示や検索処理で統一的に扱えません。また、状態区分が文字列で自由入力になっていると、完了、済、確認済み、OKなどの表記揺れが起きやすくなります。

TypeScriptでは、propertiesの型を業務ごとに具体化することで、このような問題を減らせます。現地確認点を扱う場合は、次のような型を用意できます。

`ts type SurveyPointProperties = { id: string; name: string; category: "survey_point" | "inspection_point" | "reference_point"; status: "planned" | "checked" | "needs_review"; measuredAt?: string; note?: string; };

type SurveyPointFeature = Feature; type SurveyPointCollection = FeatureCollection; `

このように定義しておくと、properties.statusには決められた値だけを入れる設計になります。これにより、画面上の表示、絞り込み、色分け、出力処理などで、想定外の値を扱う可能性を減らせます。もちろん、外部ファイルから読み込んだ時点では未知の文字列が入っている可能性があるため、読み込み直後の検証は必要です。それでも、アプリケーション内部で扱う型を明確にしておけば、処理の途中で表記揺れを増やしてしまうリスクを下げられます。

propertiesの型を設計するときは、必須項目と任意項目を分けることも大切です。管理番号や種別のように、データを識別するために欠かせない項目は必須にします。一方で、備考、写真番号、確認日時、担当者名など、すべてのデータに必ず入るとは限らない項目は任意にします。任意項目を扱う処理では、値が存在するかどうかを確認してから使う必要があります。

特に注意したいのは、空文字、null、undefinedの扱いです。TypeScriptでは、値がない状態をundefinedで表すことがありますが、JSONではundefinedは値として保存されません。外部から読み込んだJSONにはnullが入っていることもあります。つまり、TypeScript上ではnote?: stringとしていても、実際のGeoJSONではnote: nullになっている可能性があります。この違いを無視すると、文字列処理の中で実行時エラーが起きる場合があります。

実務では、外部から受け取ったpropertiesをそのまま内部の業務型として扱うのではなく、一度変換する設計が安全です。入力値を検査し、必要な項目があるか、型が合っているか、許可された値かを確認したうえで、内部用の型に変換します。変換後のデータだけを業務処理に流すようにすれば、後続の処理では比較的安心して型を使えます。

また、propertiesに数値を入れる場合も注意が必要です。たとえば、標高、延長、面積、管理番号、優先度などを数値で扱うことがあります。しかし、外部データでは数値が文字列として入っている場合もあります。管理番号のように先頭のゼロが意味を持つ値は、数値ではなく文字列として扱うほうが安全です。逆に、計算に使う延長や面積を文字列のまま扱うと、比較や集計で誤りが起きやすくなります。型定義の段階で、識別子なのか計算値なのかを分けて考えることが重要です。

propertiesを過度に汎用化しすぎることにも注意が必要です。Record<string, unknown>のような型は、どのような属性にも対応できますが、業務ロジックの中では毎回値の存在確認と型確認が必要になります。柔軟性は高いものの、開発時の支援は限定的になります。反対に、すべての項目を厳密に定義しすぎると、入力データの少しの差分にも対応しにくくなります。実務では、内部処理で必ず使う項目は厳密に定義し、補助的な項目は余剰属性として持てるようにするなど、用途に応じたバランスが必要です。

内部で使う項目を定義しつつ、追加属性も許容する型にする方法があります。

ts type ManagedProperties = { id: string; label: string; status: "active" | "inactive" | "unknown"; updatedAt?: string; } & Record<string, unknown>;

この型では、id、label、statusといった主要項目は必須にしながら、それ以外の属性も受け取れる余地を残しています。ただし、追加属性をそのまま信用するのではなく、画面表示や出力に使うときは内容を確認する必要があります。

GeoJSONのpropertiesは、現地とシステムをつなぐ情報の入れ物です。TypeScriptで型を定義するときは、単なる付属情報ではなく、業務判断に使うデータとして設計する必要があります。属性名、必須項目、値の種類、単位、更新ルール、空値の扱いを整理しておくことで、GeoJSONを単なる地図用ファイルではなく、再利用しやすい業務データとして扱えるようになります。

座標順序と座標参照系の思い込みに注意する

GeoJSONをTypeScriptで扱う際に、型定義だけでは防ぎにくい代表的な問題が座標順序です。現在一般的に使われるGeoJSONでは、地理座標は経度、緯度の順で扱います。日本語の業務会話では緯度、経度の順に言うことが多いため、実装時に順序を逆にしてしまうミスが起きやすくなります。TypeScript上ではどちらもnumberなので、[35.0, 139.0]と[139.0, 35.0]の違いを型だけで判定することはできません。

この問題を避けるためには、Positionという型名だけでなく、値の意味が分かる補助的な型や関数名を使うことが有効です。単にnumberの配列として扱うのではなく、経度と緯度の順であることを名前に含める設計が考えられます。

`ts type Longitude = number; type Latitude = number; type Height = number;

type LonLatPosition = [Longitude, Latitude] | [Longitude, Latitude, Height];

function createPosition(longitude: Longitude, latitude: Latitude): LonLatPosition { return [longitude, latitude]; } `

このようにしても、TypeScriptが経度と緯度の範囲を自動で検証してくれるわけではありません。しかし、関数の引数名や型名によって、実装者が順序を意識しやすくなります。座標を直接配列で作る箇所を減らし、createPositionのような関数を通して作るようにすれば、順序の間違いを減らしやすくなります。

実務では、座標参照系の扱いにも注意が必要です。現在一般に参照されるGeoJSONでは、地理座標はWGS 84系の経度緯度を前提に扱うのが基本です。古いデータや独自仕様では別の座標参照系を示す情報を持つ例が残っている場合もありますが、現在の相互利用を前提にしたGeoJSONとして扱うなら、任意の座標参照系をそのまま入れてよいとは考えないほうが安全です。

現場では、平面直角座標系、任意座標、施設内のローカル座標、施工用の基準座標など、さまざまな座標が使われます。これらを経度緯度のGeoJSONと同じ感覚で扱うと、地図上で大きくずれたり、まったく別の場所に表示されたりする原因になります。平面座標やローカル座標を地図表示用GeoJSONとして使う場合は、事前に座標変換の要否を確認し、変換元、変換先、単位、軸順、測地系を明確にしておく必要があります。

TypeScriptの型では、座標がnumberであることは表現できますが、そのnumberが経度緯度なのか、メートル単位の平面座標なのか、ローカルな施工座標なのかまでは自動的に判別できません。そのため、業務上は型名やデータ構造で座標の前提を明示することが重要です。GeoJSONとして地図表示に使うデータはLonLatPosition、現場内のローカル座標はLocalPositionのように分けて定義すると、混同を減らせます。

`ts type LocalPosition = { x: number; y: number; z?: number; };

type GeoPosition = [number, number] | [number, number, number]; `

このように、ローカル座標をGeoJSONのcoordinatesと同じ形にしないことも一つの工夫です。どちらも配列にしてしまうと、誤ってGeoJSONのcoordinatesにローカル座標を入れてしまう可能性があります。意味の違う座標は、あえて構造を変えることで、実装上の取り違えを見つけやすくできます。

また、座標を丸める処理にも注意が必要です。GeoJSONの座標は小数を含むことが一般的です。ファイルサイズを小さくするため、または表示を整えるために小数桁を丸めることがありますが、丸め方によっては位置精度に影響します。特に現地調査、境界確認、施工範囲、点検位置など、位置のずれが業務判断に影響するデータでは、安易な丸めは避けるべきです。丸める場合は、表示用なのか、保存用なのか、解析用なのかを分けて考える必要があります。

さらに、高さを含む座標を扱う場合は、3つ目の値の意味を明確にすることが必要です。GeoJSONの型としては[number, number, number]のように表せますが、その3つ目が楕円体高なのか、標高なのか、現場基準からの高さなのか、あるいは別の値なのかはデータ仕様を見なければ分かりません。高さ情報を含むGeoJSONを扱う場合は、properties側に高さの基準や取得方法を補足する、または別のメタ情報として管理するなどの工夫が必要です。

座標順序と座標参照系の問題は、TypeScriptの型だけで完全に防ぐことはできません。しかし、型名、関数名、変換処理、検証処理、データ仕様の整理によって、間違いに気づきやすい設計にはできます。GeoJSONを扱う実務では、座標が数値であることよりも、その数値がどの座標系で、どの順序で、どの精度で、どの業務目的に使われるのかを明確にすることが重要です。

入力データの検証と型ガードを用意する

TypeScriptで型定義を作ると、GeoJSONを安全に扱えるように感じます。しかし、外部から読み込むJSONファイルや通信で受け取るデータは、TypeScriptの型チェックを通っていません。つまり、コード上でFeatureCollection型として扱っていても、実際の中身がその形であるとは限りません。型定義は開発中の支援にはなりますが、実行時の入力値を保証するものではない点を理解しておく必要があります。

GeoJSONを外部から受け取る場合は、まずunknownとして受け取り、必要な検証をしたうえで内部の型に変換する流れが安全です。最初からanyとして扱うと、存在しないプロパティにアクセスしても型エラーが出にくくなります。unknownで受け取れば、値を使う前に確認が必要になるため、検証処理を挟む設計にしやすくなります。

基本的な型ガードは、次のように考えられます。

`ts function isObject(value: unknown): value is Record<string, unknown> { return typeof value === "object" && value !== null; }

function isPosition(value: unknown): value is Position { if (!Array.isArray(value)) { return false; }

if (value.length !== 2 && value.length !== 3) { return false; }

return value.every((item) => typeof item === "number" && Number.isFinite(item)); }

function isPointGeometry(value: unknown): value is PointGeometry { if (!isObject(value)) { return false; }

return value.type === "Point" && isPosition(value.coordinates); } `

この例はPointだけを確認する簡単なものですが、実務ではLineString、Polygon、MultiPolygonなど、それぞれの階層に合わせた検証が必要になります。座標配列が空でないか、必要な点数を満たしているか、数値が有限であるか、Polygonのリングが閉じているかなど、用途に応じて確認項目を追加します。

Featureを検証する場合は、type、geometry、propertiesを確認します。geometryはnullの可能性があります。propertiesもnullになる可能性があるため、業務上必須とするならnullを許可しない検証にします。GeoJSONの形式として許されるかどうかと、自社の業務データとして受け入れられるかどうかは分けて考える必要があります。

形式上はFeatureとして成立していても、properties.idがないデータは管理対象として扱えないかもしれません。Pointとして成立していても、座標が想定範囲外であれば現場データとしては疑わしいかもしれません。Polygonとして成立していても、面積が極端に大きい場合は座標順序や座標系を間違えている可能性があります。このように、入力検証は「構造の検証」と「業務ルールの検証」に分けると整理しやすくなります。

構造の検証では、GeoJSONとして最低限必要な形を確認します。typeが正しいか、coordinatesが配列か、座標が数値か、featuresが配列か、といった内容です。業務ルールの検証では、管理番号があるか、種別が許可された値か、日付文字列が期待する形式か、座標が対象地域の範囲内か、必要な属性が欠けていないかを確認します。どちらも重要ですが、目的が違うため、関数を分けておくと保守しやすくなります。

検証結果の扱い方も大切です。単にtrueまたはfalseを返すだけでは、どこが問題なのか分かりにくくなります。実務では、読み込みに失敗したFeatureの番号、問題のある項目名、想定した型、実際の値、修正が必要な理由などを記録できると、データ修正や関係者への確認がしやすくなります。

検証結果を次のような形で返す設計が考えられます。

`ts type ValidationIssue = { path: string; message: string; };

type ValidationResult = | { ok: true; value: T; } | { ok: false; issues: ValidationIssue[]; }; `

このようにしておくと、読み込み処理の後で、正常に使えるデータと、修正が必要なデータを分けて扱えます。画面上でエラーを表示する場合も、ログに記録する場合も、関係者に確認依頼を出す場合も、問題箇所が明確になります。

また、型ガードを作るときは、過度に複雑な処理を一つの関数に詰め込まないことが重要です。GeoJSONはGeometryの種類が多く、propertiesも業務ごとに変わります。すべてを一つのisGeoJson関数で処理しようとすると、後から変更しにくくなります。Positionの検証、Geometryの検証、Featureの検証、propertiesの検証、業務ルールの検証を分けておくと、データ形式が変わったときにも対応しやすくなります。

TypeScriptの型定義は、あくまでコードを書く側の安全性を高める仕組みです。外部から来るGeoJSONの正しさは、実行時に確認する必要があります。型定義と型ガードを組み合わせることで、読み込み時の不正データを早く見つけ、内部処理では整った型として扱うことができます。この流れを作っておくことが、GeoJSONを実務で安定して運用するための重要なポイントです。

まとめ

GeoJSONをTypeScriptで扱うときは、単にJSONを読み書きするだけではなく、地理データとしての構造と業務データとしての意味を両方整理する必要があります。Geometry、Feature、FeatureCollectionを分けて型定義し、Geometryの種類ごとにcoordinatesの階層を正しく表現することで、開発中の取り違えを減らせます。特にPoint、LineString、Polygon、MultiPolygonでは座標配列の深さが異なるため、広すぎる型でまとめず、typeによって絞り込める設計にしておくことが大切です。

propertiesは、GeoJSONを実務で使ううえで中心になる情報です。管理番号、名称、状態、更新日時、備考などをどのように持たせるかによって、検索、表示、集計、確認、受け渡しのしやすさが変わります。TypeScriptでは、業務ごとのproperties型を用意し、必須項目と任意項目を分け、値の候補を限定することで、表記揺れや入力漏れを減らしやすくなります。一方で、外部から読み込むGeoJSONには想定外の値が入る可能性があるため、内部用の型へ変換する前に検証する流れが欠かせません。

また、GeoJSONでは座標順序と座標参照系の思い込みが大きなトラブルにつながります。経度、緯度の順序を前提にしているデータと、現場のローカル座標や平面座標を同じように扱うと、地図上で位置がずれる原因になります。TypeScriptの型だけでは座標の意味までは保証できないため、型名、関数名、変換処理、検証処理で前提を明確にすることが重要です。高さを含む場合も、3つ目の値の意味や基準を別途整理しておく必要があります。

さらに、TypeScriptの型定義は実行時の入力値を保証しません。外部ファイルや通信で受け取ったGeoJSONは、unknownとして扱い、構造の検証と業務ルールの検証を行ったうえで内部処理に渡す設計が安全です。型ガードや検証結果の仕組みを用意しておけば、どのFeatureのどの項目に問題があるのかを把握しやすくなり、データ修正や関係者確認も進めやすくなります。

GeoJSONは、位置情報と業務情報を結びつける便利な形式です。しかし、便利さの裏側には、座標の順序、Geometryの種類、propertiesの表記揺れ、nullの扱い、外部データの不確実性といった注意点があります。TypeScriptを使う場合は、これらの注意点を型定義だけで解決しようとするのではなく、型設計、入力検証、変換処理、運用ルールを組み合わせて考えることが大切です。

現地で取得した位置情報をGeoJSONとして整理し、業務データと結びつけて活用するには、データの入口から出口までを見通した設計が求められます。どの座標系のデータを受け取り、どの段階でGeoJSONに変換し、どのpropertiesを業務判断に使い、どの検証を通過したデータだけを公開・共有するのかを決めておくことで、取得した位置データを実務に使いやすい形で管理しやすくなります。

現場を3Dで残して、あとから測る。
実際の画面と動画で使い方を確認できます。

LRTK Phoneの使い方・実例を見る
資料請求導入相談
現場をスマホで3DスキャンLRTK Phone実例を見る