謎の直交座標系のファイルを目前に頭を抱えた事はないだろうか。
...普通はないと思う。
これはそんなDEMファイルを処理しないといけなくなった人の物語。
Qiita初投稿です。本業は海底火山ですがそれはまた別の機会に。
XとYがこんな感じの数字で与えられている海底地形のDEMがあった。
(6811000, -2740000)
CRSが分からないのでQGISに投影できない。
まず勘で見当をつける。
数字的に直交座標系であることは間違いなさそう。単位をメートルとすると、1000kmのオーダーになるのでいかにもそんな感じである。
しかしUTM座標系であれば多くの場合Xが6桁、Yが7桁の正の数字になるところが、この座標はXが7桁、Yがなんと負の7桁である。
UTMではないか、UTMだとしても間違ったゾーン設定で作られた可能性が高い。
場所はニュージーランド沖なのでNZ国土地理院にある直交座標系をすべて試したが、全部違った。
やっぱり自動化
そういう訳で特定は諦め、機械に頼ることにした。
方針は以下の3点。
- Projモジュールの座標変換機能(transform)を使ってEPSGコード(取り敢えず1000~40000まで)に総当りを行う
- 事前情報としてこの座標がNZ北方、南緯-32~-30度の間にある事が分かっていたので、WGS84に変換を試みた後、これを用いて結果をフィルタリング(def isvalid)する
- XとYが入れ替わっている可能性も考え、1つのEPSGコードごとに入力側と出力側合わせて4通りを検討する(def check)
from pyproj import Proj, transform
x1, y1 = 6811000, -2740000
WGS84 = Proj(init='epsg:4326')
## 出力された座標が妥当かを返す。事前情報はここに。
def isvalid(x,y):
if y<-32.0 or -30.0<y: return False
return True
def check(epsg):
if(epsg % 10000 == 0): print('=> ',epsg)
## 第1関門:未定義EPSGだった場合はここでRuntimeErrorが返る。
try:
if(epsg<10**4): proj1 = Proj(init=('epsg:%04d' % epsg))
elif(epsg<10**5): proj1 = Proj(init=('epsg:%05d' % epsg))
elif(epsg<10**6): proj1 = Proj(init=('epsg:%06d' % epsg))
except RuntimeError: return None
## 第2関門:座標変換を試みる。変換不可能ならRuntimeErrorが返る。
try: x2,y2 = transform(proj1, WGS84, x1,y1)
except RuntimeError: pass
else:
if isvalid(x2,y2): print(epsg, x1,y1, x2,y2)
if isvalid(y2,x2): print(epsg, x1,y1, y2,x2)
## 第3関門:XとYを入れ替えて座標変換。
try: x2,y2 = transform(proj1, WGS84, y1,x1)
except RuntimeError: pass
else:
if isvalid(x2,y2): print(epsg, y1,x1, x2,y2)
if isvalid(y2,x2): print(epsg, y1,x1, y2,x2)
## という感じでリスト内包表記を使って1000~40000に総当り。
void = [check(i) for i in range(1000,40000)]
実行すると、epsg, x1,y1, x2,y2という形でブアーッと出力される。
3795 6811000 -2740000 -12.248595429748068 -31.56469346681908
3950 6811000 -2740000 24.482815965032906 -31.5999781135824
3994 6811000 -2740000 -179.0469481850484 -31.112571615808832
4455 6811000 -2740000 1.938224862502011 -30.09909426737733
4855 -2740000 6811000 46.07814966253316 -31.334547234623837
さがしていたのはこれ(EPSG:3994 Mercator41)でした。なんじゃそりゃー。
どうもニュージーランド大気海洋局のCRSらしい。NZ国土地理院のサイトを探しても見つからないわけだ…。