OpenMactiles 및 go-Staticmaps

이 글은 모바일 팩토리 Advent Calendar 2017 열흘째 되는 글이다.
이번에는 go-staticmaps라는 프로그램 라이브러리를 소개하고 싶습니다.
https://github.com/flopp/go-staticmaps

go-staticmaps


이 프로그램 라이브러리는 지도의 판식 데이터 (지도 데이터를 사각으로 자른 모양) 를 표시하거나 그리거나 최종적으로 그림으로 출력할 수 있습니다.
이것은 자신이 창작한 지도 이미지를 쉽게 만들고 싶을 때 가장 좋은 도서관이다.

얼른 써봐.


가고 싶지만 그 전에 이번에 사용할 타일 데이터를 준비하겠습니다.
이번에 사용된 지도 타일 데이터OpenMapTiles.
사실 자신이 타일 데이터를 준비하지 않아도 go-staticmaps는 OpenStreetMap의 타일 데이터를 기본적으로 사용해서 지도를 표시할 수 있다.
하지만 OpenMapTiles는 기본적으로 여러 가지 스타일이 있는데 취향에 따라 바꿀 수 있기 때문에 이번에는 타일 서버를 사용해 보기로 했다.

배열 데이터 준비


준비는 간단하다.공식적으로 Docker를 사용하여 타일 서버를 만드는 프로그램을 제공하기 때문에 프로그램대로 진행됩니다.
https://openmaptiles.com/server/#install
시간이 좀 걸리겠지만 딱히 막히는 곳이 없다고 생각해서 자세한 설명은 필요 없지만 일본 전체의 타일 데이터를 다운받아 localhost로 연결하면 이런 지도가 나올 것 같아요.

go-staticmaps 사용


그럼 goo-taticmaps를 사용하세요.
우선 원본 코드를 넣으세요.
package main

import (
  "image/color"
  "github.com/flopp/go-staticmaps"
  "github.com/fogleman/gg"
  "github.com/golang/geo/s2"
)

func newTileProvider() *sm.TileProvider {
  t := new(sm.TileProvider)
  t.Name = "example-map"
  t.Attribution = "(c) OpenMapTiles"
  t.TileSize = 256
  t.URLPattern = "http://localhost:32769/styles/klokantech-basic/%[2]d/%[3]d/%[4]d.png"
  t.Shards = []string{"a", "b", "c"}
  return t
}

func main() {
  ctx := sm.NewContext()
  ctx.SetTileProvider(newTileProvider()) //タイルデータ指定
  ctx.SetSize(400, 300)
  ctx.SetZoom(17)

   //マーカーを追加
  spot := s2.LatLngFromDegrees(35.6259434, 139.7251859)
  ctx.AddMarker(sm.NewMarker(spot, color.RGBA{0xff, 0, 0, 0xff}, 16.0))

  // 画像として出力
  img, _ := ctx.Render()
  gg.SavePNG("my-map.png", img)
}
이것은 메인입니다."go"로 저장하고 실행하면 다음 이미지가 출력됩니다.

해설


지금부터 소스 코드를 설명합니다.newTileProvider 함수
지도를 표시하는 데 사용할 기와 조각 데이터를 지정합니다.
앞에서 설명한 대로 기본 기와 조각 데이터를 사용하려면 이 함수가 필요하지 않습니다.
여기에 방금 준비한 OpenMapTiles의 타일 데이터의 URL 지정 이외에 몇 가지 파라미터가 설정되어 있지만 URLPatternTileSize 이외에는 모두 필수적이지 않기 때문에 없어도 상관없다.Attribution를 지정하지 않으면 이미지 아래에 검은색 테이프가 표시되지 않습니다.URLPattern%[2]d,%[3]d,%[4]d는 각각 줌, x 좌표, y 좌표에 대응한다.
URLPattern의 URL을 아래 위치에서 가져옵니다.그리고 {z}%[2]d로 변하는 곳을 x와 y로 바꾸면 된다.
main 함수ctx.SetSizectx.SetZoom는 임의로 설정할 수 있는 매개 변수다.전체 맵 이미지의 크기와 배율을 지정할 수 있습니다.
지정하지 않으면 자동으로 치수와 배율로 조정됩니다.
표시가 추가된 부분에서 좌표는 한 번에 전달됩니다s2.LatLngFromDegrees.
이런 수치의 좌표는 LatLng형으로 바꾸어 sm.NewMarker에 전달할 수 있다.sm.NewMarker에서 태그를 배치할 좌표, 색상 및 치수를 지정하여 태그 인스턴스를 생성합니다.Render 함수는 타일 데이터에 표시나 경로 등을 그리고 반환합니다.gg.SavePNG를 사용하여 확장자와 파일 이름을 지정하여 저장합니다.

경로도 추가하고 싶어요.


방금 전의 코드를 약간 수정하면 태그 사이에 경로를 그릴 수 있습니다.
  //マーカーを追加
  spot1 := s2.LatLngFromDegrees(35.6259434, 139.7251859)
  ctx.AddMarker(sm.NewMarker(spot1, color.RGBA{0xff, 0, 0, 0xff}, 16.0))

  spot2 := s2.LatLngFromDegrees(35.620023, 139.72818)
  ctx.AddMarker(sm.NewMarker(spot2, color.RGBA{0, 0xff, 0, 0xff}, 16.0))

  // パスを追加
  path := new(sm.Path)
  path.Positions = []s2.LatLng{spot1, spot2}
  path.Color = color.RGBA{0, 0, 0xff, 0xff} //パスの色
  path.Weight = 3.0 //パスの幅
  ctx.AddPath(path)

영역 추가하기


태그와 경로뿐만 아니라 지정된 위치도 채울 수 있습니다.
  //マーカーを追加
  spot1 := s2.LatLngFromDegrees(35.6259434, 139.7251859)
  ctx.AddMarker(sm.NewMarker(spot1, color.RGBA{0xff, 0, 0, 0xff}, 16.0))

  spot2 := s2.LatLngFromDegrees(35.620023, 139.72818)

  spot3 := s2.LatLngFromDegrees(35.626159, 139.723602)

  // エリアを追加
  area := new(sm.Area)
  area.Positions = []s2.LatLng{spot1, spot2, spot3}
  area.Color = color.RGBA{0, 0, 0xff, 0xff} //パスの色
  area.Fill = color.RGBA{0, 0xff, 0xff, 0xff} //塗りつぶす色
  area.Weight = 3.0 //パスの幅
  ctx.AddArea(area)

총결산


간단하게 지도 타일 서버 준비부터 지도 타일 데이터에 표시를 하거나 경로를 그릴 수 있다.대단해!!
이렇게 하면 언제든지 자신만의 지도 이미지를 만들 수 있다.
나는 도서관의 내용도 매우 간단하고 쫓기 쉬우며 관심 있는 사람이 가서 보면 매우 재미있을 것이라고 생각한다.


예?지금도 충분히 간단한데 지도 이미지를 더 간단하게 만들고 싶으세요?
그런 사람을 위해서.go-staticmaps도 명령줄에서 실행할 수 있습니다.
go get -u github.com/flopp/go-staticmaps/create-static-map
를 참고하십시오.
$ create-static-map -m "35.6259434,139.7251859"
그러면

이렇게압도적인 간편함.물론 경로를 당기거나 구역을 포위하거나 라이브러리를 포위할 때 기능은 기본적으로 변하지 않는다.
하지만 OpenMapTiles처럼 자신이 준비한 타일 서버에서는 타일 데이터를 얻을 수 없으니 주의하십시오.
그럼 편안한 지도 이미지 생활을 즐기세요.

좋은 웹페이지 즐겨찾기