緯度経度の情報でポリゴン生成し、GeoJsonに変換してみよう! (Go言語)

3 min read読了の目安(約2700字

はじめに

この記事では、特定の4箇所の緯度経度からポリゴンを生成し、GeoJsonを作成する方法をまとめたものです。
また、使用言語はGoになります。

GeoJsonとは?

GeoJSONとは、JSONを基としたGISデータを記述するためのフォーマットです。
Google mapやOpen street mapなどの地図サービスも対応しているため、読み込ませるだけで、エリアを可視化できたり、ポイントの表示が可能となります。

参考: GIS実習オープン教材

実装

orbライブラリ

今回はGoで実装を行なっていったのですが、緯度経度の情報からポリゴンを作成し、GeoJson形式にしてくれるライブラリがあります。
それがorbライブラリです。
このライブラリ、Stravaでも使われたライブラリのようです。

ポリゴン

ちなみにポリゴンなのですが、GISのポリゴンというのは、ベクトルデータ(すなわち、座標値を持った点のデータ)でを表現したものを指します。

そのため、ポリゴンを作成する際は、最低でも3つの点を必要とします。

また、注意しなければならないのは、下記のコードのように最初のポイントの緯度経度を最後にポイントとして指定しなければなりません。こうすることで、面を表現できる。

p := orb.Polygon{{{Lng1, Lat1}, {Lng2, Lat2}, {Lng3, Lat3}, {Lng4, Lat4},{Lng1, Lat1}}}
package main

import (
	"github.com/paulmach/orb"
	"github.com/paulmach/orb/geojson"
)

func main() {
	convertGeojeson(35.681, 139.77496, 35.68563, 139.76234,35.67681, 139.76002,35.6751, 139.77165)
}

func convertGeojeson(Lat1 float64, Lng1 float64, Lat2 float64, Lng2 float64,  Lat3 float64, Lng3 float64,  Lat4 float64, Lng4 float64) {

	name := "エリア"
	// ポリゴンの作成
	p := orb.Polygon{{{Lng1, Lat1}, {Lng2, Lat2}, {Lng3, Lat3}, {Lng4, Lat4},{Lng1, Lat1}}}

	// geojsonの作成
	c := geojson.NewFeatureCollection()
	gp := geojson.NewFeature(p)
	gp.Properties["name"] = name

	c = c.Append(gp)
	b, _ := c.MarshalJSON()
	println(string(b))
}
{
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            139.77496,
                            35.681
                        ],
                        [
                            139.76234,
                            35.68563
                        ],
                        [
                            139.76002,
                            35.67681
                        ],
                        [
                            139.77165,
                            35.6751
                        ],
                        [
                            139.77496,
                            35.681
                        ]
                    ]
                ]
            },
            "properties": {
                "name": "エリア"
            }
        }
    ],
    "type": "FeatureCollection"
}

mapに食わせてみる

結果が得られたので、このGeoJsonをmapに出力してみたいと思います。
その時に便利なのがこちらのサイトです。
GeoJsonを食わせるだけで、mapに表示してくれます。

スクリーンショット 2021-01-27 13.39.03.png