goo-staticmaps 지도에 임의의 그림을 아이콘으로 표시하려면

10127 단어 Gogo-staticmaps
이 글은 모바일 팩토리 Advent Calendar 2017 16일째 되는 글이다.
열흘째 보도에서 나는 go-staticmmaps라는 프로그램 라이브러리를 소개했다.
https://github.com/flopp/go-staticmaps
사실 최근 이 창고에서 꺼낸 p-r(작은 변경)가 합병되면서 떠올랐다.
그래서 이번에 오랜만에 기회가 왔어요. 저번에 보도된 속편으로서 프로그램 라이브러리를 더 잘 만들기 위해 더 생각해 봤어요!나는 이런 내용으로 쓰고 싶다.

지도에 임의의 그림을 아이콘으로 표시하려면


현재 go-staticmaps는 어떤 점을 나타내는 물건으로 기호를 준비하고 있다.
그러나 이 표시는 크기와 색깔을 바꿀 수 있지만 모양은 바꿀 수 없다.
모처럼 한번 왔는데 회사 장소를 나타내는 지도에 회사 로고, 어떤 캐릭터와 관련된 곳에 그 캐릭터의 얼굴을 표시하는 등 이렇게 사용하려고 했다.
따라서 임의의 이미지를 아이콘으로 표시할 수 있는 프로그램 라이브러리를 확장했습니다.

현재 태그의 구현


지금의 표기가 어떻게 실현되었는지 봅시다.
https://github.com/flopp/go-staticmaps/blob/master/marker.go#L125-L149
gc.DrawArc(x, y-m.Size, radius, (90.0+60.0)*math.Pi/180.0, (360.0+90.0-60.0)*math.Pi/180.0)
gc.LineTo(x, y)
gc.ClosePath()
gc.SetColor(m.Color)
gc.FillPreserve()
gc.SetRGB(0, 0, 0)  
gc.Stroke()
대단하네, 2D 그림을 그릴 수 있는 프로그램 라이브러리에 기호가 그려져 있어.
따라서 이미지를 표시하는 장치가 없는 것 같으니 다시 만들자.

icon.go의 실현

Icon 이런 새로운 기능을 설치해 보았다.
이 옵션을 사용하면 지정한 위치에 그림을 표시할 수 있습니다.
물론 기존의 표지와 경로를 결합시켜 표시할 수도 있다.

사용법


사용법을 설명하다.
package main

import (
  "path/to/tsukumaru/go-staticmaps" //cloneしてきたパス
  "github.com/fogleman/gg"
  "github.com/golang/geo/s2"
)

func main() {
  ctx := sm.NewContext()

  spot := s2.LatLngFromDegrees(35.6259434, 139.7251859)
  icon := sm.NewIcon(spot, "tsukumaru.jpeg", 30 ) //座標、画像のパス、サイズ
  icon.SetOffset(0, 0) //オフセット
  ctx.AddIcon(icon)

  // 画像として出力
  img, _ := ctx.Render()
  gg.SavePNG("my-map.png", img)
}
지금까지의 Marker와 Path처럼 사용할 수 있습니다.
"path/to/tsukumaru/go-staticmaps"
현재 add_icon지점이 변경되었으니 사용하려면 clonetsukumaru/go-staticmaps지점을 변경하세요.

NewIcon 함수


이미지를 표시할 좌표, 이미지 경로 및 크기를 지정합니다.
크기는 지정한 너비와 높이의 수치로 초기화되며, 각각 변경하려면 SetWidth 함수를 사용합니다.

SetHeight 함수


이 함수는 Offset을 지정합니다.
기본적으로 이미지는 지정된 점을 중심으로 표시되므로 조금 위로 올리려는 경우에 사용합니다.

이루어지다


실장한 내용으로 그렇게 어려운 일은 하지 않았다. 다음은 전부다.
https://github.com/tsukumaru/go-staticmaps/blob/add_icon/icon.go#L75-L81
img = resize.Resize(i.Width, i.Height, img, resize.Lanczos3) //画像のリサイズ

//指定された場所を中心として画像が表示されるように
x, y := trans.ll2p(i.Position)
ix := int(x) - int(i.Width/2) 
iy := int(y) - int(i.Height/2)

//オフセットつきで画像を描画
gc.DrawImageAnchored(img, ix, iy, i.Offset[0], i.Offset[1])
그림 크기는 다음 프로그램 라이브러리를 사용하여 지정한 크기로 조정합니다.보완 함수의 지정은 무의식중에 지정한 것이다...
https://github.com/nfnt/resize SetOffset 이 함수는 내부에 정의된 함수로 trans.ll2p형에서 내부 좌표로 변환할 수 있다.
https://github.com/flopp/go-staticmaps/blob/master/context.go#L292-L308
그림 그리기에는 LatLng 의 편이량 fogleman/gg 을 고려하여 적당한 함수가 있습니다.
https://github.com/fogleman/gg/blob/master/context.go#L575-L591
합성 이미지 같은 게 필요하지 않을까 해서 단순히 그림을 그리면 될 것 같아요.

총결산


goo-staticmaps로 지도 이미지에 임의의 이미지를 표시하기 위해 DrawImageAnchored라는 새로운 기능을 설치해 보았습니다.기존 기능과 동일하게 사용할 수 있습니다.
하지만 아직 명령행에 대응하지 않았습니다. 개선할 점이 많습니다. 개선한 후에 p-r를 내면 좋겠습니다!
내일은 @tenmihi입니다.기대된다!

좋은 웹페이지 즐겨찾기