Skip to content

Commit

Permalink
Documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
p4ken committed Jun 14, 2024
1 parent 0306b2a commit e1af538
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 49 deletions.
90 changes: 53 additions & 37 deletions src/crs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,32 @@ use crate::LatLon;
#[cfg(feature = "tky2jgd")]
use crate::TKY2JGD;

#[cfg(feature = "patchjgd")]
use crate::TOUHOKUTAIHEIYOUOKI2011;

pub fn from_tokyo(lat: f64, lon: f64) -> Tokyo {
Tokyo::new(LatLon(lat, lon))
}

pub fn from_tokyo97(lat: f64, lon: f64) -> Tokyo97 {
// Tokyo97::new(LatLon(lat, lon))
todo!()
}

pub fn from_jgd2000(lat: f64, lon: f64) -> Jgd2000 {
Jgd2000::new(LatLon(lat, lon))
}

pub fn from_jgd2011(lat: f64, lon: f64) -> Jgd2000 {
Jgd2000::new(LatLon(lat, lon))
}

// pub fn from_tokyo_(p: impl Into<LatLon>) -> Tokyo {
// Tokyo(p.into())
// }

/// 旧日本測地系。
/// Tokyo Datum, the older Japanese Datum.
/// Tokyo Datum, The older Japanese Datum.
///
/// EPSG: 4301
pub struct Tokyo {
Expand All @@ -35,52 +51,52 @@ impl Tokyo {
// Self { lat: y, lon: x }
// }

/// [`TKY2JGD`] を用いて [`JGD2000`] へ変換する。
/// [`TKY2JGD`] を用いて [`Jgd2000`] へ変換する。
/// Transform to JGD2000.
///
/// # Limitations
///
/// 日本国内の地表面の座標のみに使用できる。地中や空中ではズレが大きくなる。
///
/// パラメータグリッドの範囲外の座標は、[`Tokyo97`] を経由し、一律の数式による変換にフォールバックされる。
/// たとえ陸地であっても、無人島や、後年に埋め立てられた沿岸部などで、パラメータグリッドが欠損している。
/// 複数の座標で表される形状が、パラメータグリッドの範囲内外をまたがっていると、変換後の形状が大きく変わる可能性がある。
///
/// パラメータグリッドの範囲外の場合は、3パラメータにフォールバックする
/// 国土地理院によるオリジナルの実装の精度は、一定条件下で「緯度, 経度の標準偏差はそれぞれ9cm, 8cm」[(飛田, 2002)](crate#references) とされている
#[cfg(feature = "tky2jgd")]
pub fn to_jgd2000(&self) -> Jgd2000 {
// 国土地理院時報(2002,97集)「世界測地系移行のための座標変換ソフトウェア”TKY2JGD"」
// https://www.gsi.go.jp/common/000063173.pdf
// > 地域毎の変換パラメータの格子点は,3 次メッシュの中央ではなく,南西隅に対応する。
match TKY2JGD.interpolate(self.lat_lon) {
Some(shift) => Jgd2000::new(self.lat_lon + shift),
None => self.to_tokyo97().to_jgd2000(),
}
}

/// 離島位置の補正量を用いて [`Tokyo97`] へ変換する
/// 離島位置の補正量 [(飛田, 2003)](crate#references) を用いて [`Tokyo97`] へ変換する
pub fn to_tokyo97(&self) -> Tokyo97 {
// 日本測地系における離島位置の補正量
// https://www.jstage.jst.go.jp/article/sokuchi1954/49/3/49_3_181/_pdf
// https://www.drm.jp/jisx0410/JisGridSystem_1_Geoid.html
todo!()
}
}

/// Tokyo97 座標系。
/// Tokyo97, the older Japanese Datum.
///
/// 3パラメータを用いた変換式で定義される[^1]旧日本測地系。
/// 旧日本測地系。
/// Tokyo 97, The older Japanese Datum.
///
/// [^1]: 飛田幹男 [最近の測地座標系と座標変換についての考察](https://www.jstage.jst.go.jp/article/sokuchi1954/43/4/43_4_231/_pdf) (測地学会誌 43巻 4号 (1997) pp231-235)
/// 世界測地系を基準に、3パラメータによる変換式で定義された測地系 [(飛田, 1997)](crate#references)。
pub struct Tokyo97 {
lat_lon: LatLon,
}
impl Tokyo97 {
/// 3パラメータを用いて [`JGD2000`] へ変換する
/// 3パラメータによる変換式 [(飛田, 1997)](crate#references) を用いて [`Jgd2000`] へ変換する
pub fn to_jgd2000(&self) -> Jgd2000 {
todo!()
}

/// 離島位置の補正量を用いて [`TokyoDatum`] へ逆変換する
pub fn to_tokyo(&self) {
// 日本測地系における離島位置の補正量
// https://www.jstage.jst.go.jp/article/sokuchi1954/49/3/49_3_181/_pdf
}
/// 離島位置の補正量 [(飛田, 2003)](crate#references) を用いて [`Tokyo`] へ逆変換する。
pub fn to_tokyo(&self) {}
}

/// 世界測地系
/// JGD2000, Japanese Geodetic Datum 2000.
/// 世界測地系 JGD2000.
/// Japanese Geodetic Datum 2000.
///
/// EPSG: 4612
pub struct Jgd2000 {
Expand All @@ -90,32 +106,32 @@ pub struct Jgd2000 {
impl Jgd2000 {
// GRS80楕円体

pub fn new(degree: impl Into<LatLon>) -> Self {
fn new(degree: impl Into<LatLon>) -> Self {
let lat_lon = degree.into();
Self { lat_lon }
}

/// `touhokutaiheiyouoki2011.par` を用いて [`JGD2011`] へ変換する
/// [`TOUHOKUTAIHEIYOUOKI2011`] を用いて [`Jgd2011`] へ変換する。
///
/// パラメータグリッド内の一部地域に欠損があり、
pub fn to_jgd2011(&self) -> Jgd2011 {
// 地震時地殻変動に伴う座標値の変化を補正するソフトウェア“PatchJGD”
// https://www.jstage.jst.go.jp/article/sokuchi/55/4/55_4_355/_pdf/-char/ja
todo!()
}

/// `tky2jgd.par` を用いて [`TokyoDatum`] へ逆変換する
/// [`TKY2JGD`] を用いて [`Tokyo`] へ逆変換する。
/// Inverse of [`Tokyo::to_jgd2000`].
///
/// 今後、あらゆるデータが世界測地系で測量、作成されるため、なるべく本メソッドは使わない方が良い。
/// 新旧の測地系の座標を重ねる用途であれば、原則として旧日本測地系から世界測地系へ変換した方が良い。
pub fn to_tokyo(&self) {}

/// 3パラメータを用いて [`Tokyo97`] へ逆変換する
pub fn to_tokyo97(&self) {
// https://www.drm.jp/jisx0410/JisGridSystem_1_Geoid.html

// https://www.jstage.jst.go.jp/article/sokuchi1954/43/4/43_4_231/_pdf
// > このパラメータによって定義される日本測地系がTokyo97である
}
/// 3パラメータを用いて [`Tokyo97`] へ逆変換する。
/// Inverse of [`Tokyo97::to_jgd2000`].
pub fn to_tokyo97(&self) {}
}

/// 世界測地系
/// JGD2011, Japanese Geodetic Datum 2011.
/// 世界測地系 JGD2011.
/// Japanese Geodetic Datum 2011.
///
/// EPSG: 6668
pub struct Jgd2011 {
Expand All @@ -130,7 +146,7 @@ impl Jgd2011 {
// self.lat_lon.rev()
// }

/// `touhokutaiheiyouoki2011.par` を用いて [`JGD2000`] へ逆変換する
/// [`TOUHOKUTAIHEIYOUOKI2011`] を用いて [`Jgd2000`] へ逆変換する
pub fn to_jgd2000(&self) {}
}

Expand Down
5 changes: 3 additions & 2 deletions src/grid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ use crate::{par, LatLon};

/// 日本測地系から世界測地系への座標変換パラメータ。
///
/// 出典: 国土地理院 [TKY2JGD.par](https://www.gsi.go.jp/sokuchikijun/tky2jgd_download.html) (Ver.2.1.2) を加工して作成
/// 出典: 国土地理院 [TKY2JGD.par](https://www.gsi.go.jp/sokuchikijun/tky2jgd_download.html) (Ver.2.1.2, 2003年公開) をもとに形式を変換して作成
#[cfg(feature = "tky2jgd")]
pub const TKY2JGD: Grid = par::TKY2JGD.to_grid();

/// 平成23年(2011年)東北地方太平洋沖地震の座標補正パラメータ。
///
/// 出典: 国土地理院 [touhokutaiheiyouoki2011.par](https://www.gsi.go.jp/sokuchikijun/sokuchikijun41012.html) (Ver.4.0.0) を加工して作成
/// 出典: 国土地理院 [touhokutaiheiyouoki2011.par](https://www.gsi.go.jp/sokuchikijun/sokuchikijun41012.html) (Ver.4.0.0, 2017年公開) をもとに形式を変換して作成
#[cfg(feature = "patchjgd")]
pub const TOUHOKUTAIHEIYOUOKI2011: Grid = par::TOUHOKUTAIHEIYOUOKI2011.to_grid();

Expand All @@ -29,6 +29,7 @@ impl<'a> Grid<'a> {
/// 指定された座標が属する3次メッシュの四隅すべてのパラメータがグリッド内に存在しなければならない。
/// 一つでも欠けていた場合は `None` を返す。
pub fn interpolate(&self, p: LatLon) -> Option<LatLon> {
// 地域毎の変換パラメータの格子点は,3 次メッシュの中央ではなく,南西隅に対応する (飛田, 2002)
let mesh = Mesh3::floor(p);
let i = self.search_after(0, mesh)?;
let sw_shift = self.dots[i].shift;
Expand Down
51 changes: 47 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,55 @@
//! 日本の測地座標を変換する
//! Transform geodetic coordinates used in Japan.
//! 日本の座標の測地系を変換する
//! Transform geodetic coordinate systems used in Japan.
//!
//! 日本国内の地表面の座標のみを対象としている。海上、空中、地中、国外には適さない。
//! # Examples
//!
//! 旧日本測地系 [`Tokyo`] の北緯35度・東経135度を、世界測地系 [`Jgd2011`] に変換する。
//!
//! ```
//! let (lat, lon) = jgd::from_tokyo(35.0, 135.0)
//! .to_jgd2000()
//! .to_jgd2011()
//! .lat_lon();
//! ```
//!
//! <br>
//!
//! [`geo::geometry`] の測地系を変換する。
//!
//! ```
//! use geo::{Coord, LineString, MapCoords};
//!
//! let tokyo_datum = LineString::from(vec![(135.0, 35.0), (135.1, 35.1)]);
//! let jgd2011 = tokyo_datum.map_coords(|Coord { x, y }| {
//! // 順序に注意: lat, lon <-> y, x
//! let (y, x) = jgd::from_tokyo(y, x).to_jgd2000().to_jgd2011().lat_lon();
//! Coord { x, y }
//! });
//! ```
//!
//! # Limitations
//!
//! 日本国内の陸地の座標を対象としている。海上や国外には適さない。
//!
//! 測地系変換によって、ある測地系で測量、作成された座標を、あたかも別の測地系かのように「再現」できる。
//! 異なる測地系で整備された座標同士のズレを「低減」できても、ズレが消滅することはない。
//! 変換メソッド毎に精度や制約が異なり、詳細はそれぞれのドキュメントに記載されている。
//!
//! 度単位の緯度経度のみ変換可能。平面直角座標系は未対応。
//!
//! # Features
//!
//! 有効にすると、ビルド後のバイナリサイズが増える。
//!
//! - `tky2jgd` - [TKY2JGD] を使用する。デフォルトで有効。
//! - `patchjgd` - [TOUHOKUTAIHEIYOUOKI2011] を使用する。デフォルトで有効。
//!
//! # References
//!
//! - 飛田幹男 [最近の測地座標系と座標変換についての考察](https://www.jstage.jst.go.jp/article/sokuchi1954/43/4/43_4_231/_pdf) (測地学会誌 43巻 4号 (1997) pp231-235)
//! - 飛田幹男 [世界測地系移行のための座標変換ソフトウェア "TKY2JGD"](https://www.gsi.go.jp/common/000063173.pdf) (国土地理院時報 97集 (2002) pp31-51)
//! - 飛田幹男ほか [日本測地系における離島位置の補正量](https://www.jstage.jst.go.jp/article/sokuchi1954/49/3/49_3_181/_pdf) (測地学会誌 49巻 3号 (2003) pp181-192)
//! - 飛田幹男 [地震時地殻変動に伴う座標値の変化を補正するソフトウェア "PatchJGD"](https://www.jstage.jst.go.jp/article/sokuchi/55/4/55_4_355/_pdf/-char/ja) (測地学会誌 55巻 4号 (2009) pp355-367)
mod coord;
mod crs;
Expand All @@ -17,7 +58,9 @@ mod island;
mod par;

use coord::{LatLon, LonLat};
pub use crs::{from_tokyo, Jgd2000, Jgd2011, Tokyo, Tokyo97};
pub use crs::{
from_jgd2000, from_jgd2011, from_tokyo, from_tokyo97, Jgd2000, Jgd2011, Tokyo, Tokyo97,
};
use grid::Grid;
#[cfg(feature = "tky2jgd")]
pub use grid::TKY2JGD;
Expand Down
6 changes: 0 additions & 6 deletions src/par.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,6 @@ pub const TKY2JGD: Bin<4707876> = Bin(*include_bytes!("../par/TKY2JGD.in"));
pub const TOUHOKUTAIHEIYOUOKI2011: Bin<1932636> =
Bin(*include_bytes!("../par/touhokutaiheiyouoki2011.in"));

pub fn tky2jgd(lat: i32, lon: i32) -> (i32, i32) {
(0, 0)
}

pub fn inverse() {}

// wrap bytes to align
#[repr(align(4))]
pub struct Bin<const N: usize>([u8; N]);
Expand Down

0 comments on commit e1af538

Please sign in to comment.