Skip to content

Instantly share code, notes, and snippets.

@tohka
Created June 24, 2020 15:51
Show Gist options
  • Save tohka/c64e70f60e447368e14b9be6148ef4b5 to your computer and use it in GitHub Desktop.
Save tohka/c64e70f60e447368e14b9be6148ef4b5 to your computer and use it in GitHub Desktop.
図郭コードから座標値を取得する
# 図郭コードから [xmin, ymin, xmax, ymax] を求める
# 図郭コードは平面直角座標系の系を除外したコードとする
# 例) 09LD352 → LD352
def zukaku(code, output_wkt=false)
level = nil
if code =~ /^[A-T][A-H]$/
level = 50000
elsif code =~ /^[A-T][A-H]\d\d$/
level = 5000
elsif code =~ /^[A-T][A-H]\d\d[1-4]$/
level = 2500
elsif code =~ /^[A-T][A-H]\d\d[0-4][A-E]$/
level = 1000
elsif code =~ /^[A-T][A-H]\d\d\d\d$/
level = 500
else
raise ArgumentError, "Invalid code - #{code}"
end
xmin = -160000
ymax = 300000
xmin += 40000 * (code[1].ord - "A".ord)
ymax -= 30000 * (code[0].ord - "A".ord)
if level <= 5000
xmin += 4000 * code[3].to_i
ymax -= 3000 * code[2].to_i
end
if level == 2500
c = code[4].to_i - 1
xmin += 2000 * (c % 2)
ymax -= 1500 * (c / 2)
elsif level == 1000
xmin += 800 * (code[5].ord - "A".ord)
ymax -= 600 * code[4].to_i
elsif level == 500
xmin += 400 * code[5].to_i
ymax -= 300 * code[4].to_i
end
xmax = xmin + (0.8*level).round
ymin = ymax - (0.6*level).round
if output_wkt
c = [xmin, ymin, xmax, ymin, xmax, ymax, xmin, ymax, xmin, ymin]
return "POLYGON((%d %d, %d %d, %d %d, %d %d, %d %d))" % c
else
return [xmin, ymin, xmax, ymax]
end
end
# test
puts zukaku('LD').inspect
puts zukaku('LD24').inspect
puts zukaku('LD242').inspect
puts zukaku('LD2461').inspect
puts zukaku('LD2461', true)
puts zukaku('LD248').inspect #=> ArgumentError
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment