1 Star 0 Fork 0

leminewx / gov2x

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
kml.go 3.82 KB
一键复制 编辑 原始数据 按行查看 历史
wenxian 提交于 2024-04-10 17:15 . 0.0.5.7:优化KML文件写入
package file
import (
"encoding/xml"
"fmt"
"io"
"log/slog"
"os"
"strconv"
"strings"
)
type (
Kml struct {
xmlns string
xmlVer string
styleId string
encoding string
iconHref string
coordinates [][3]float64
}
Point struct {
Coordinates string `xml:"coordinates"`
}
)
func NewKml() *Kml {
return &Kml{
xmlns: "http://earth.google.com/kml/2.1",
xmlVer: "1.0",
styleId: "Pt_STYLE",
encoding: "UTF-8",
iconHref: "http://maps.google.com/mapfiles/kml/pal3/icon52.png",
}
}
func (own *Kml) WithXmlns(xmlns string) *Kml {
own.xmlns = xmlns
return own
}
func (own *Kml) WithXmlVer(xmlVer string) *Kml {
own.xmlVer = xmlVer
return own
}
func (own *Kml) WithStyleId(styleId string) *Kml {
own.styleId = styleId
return own
}
func (own *Kml) WithEncoding(encoding string) *Kml {
own.encoding = encoding
return own
}
func (own *Kml) WithIconHref(iconHref string) *Kml {
own.iconHref = iconHref
return own
}
func (own *Kml) ReadFromFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
data, err := io.ReadAll(file)
if err != nil {
return err
}
var points = struct {
XMLName xml.Name `xml:"kml"`
Document struct {
Placemark []struct {
Point struct {
Coordinates string `xml:"coordinates"`
} `xml:"Point"`
} `xml:"Placemark"`
} `xml:"Document"`
}{}
if err := xml.Unmarshal(data, &points); err != nil {
return err
}
own.coordinates = make([][3]float64, 0)
for _, point := range points.Document.Placemark {
cs := strings.Split(strings.TrimSpace(point.Point.Coordinates), ",")
cLon, _ := strconv.ParseFloat(cs[0], 64)
cLat, _ := strconv.ParseFloat(cs[1], 64)
cTime, _ := strconv.ParseFloat(cs[2], 64)
own.coordinates = append(own.coordinates, [3]float64{cLon, cLat, cTime})
}
return nil
}
func (own *Kml) WriteToFileFromChannel(filename string, data <-chan [3]float64) error {
// 创建文件
file, err := os.Create(filename)
if err != nil {
return err
}
go func() {
defer file.Close()
// 写入 KML 文件头部
if err := own.writeHead(file); err != nil {
slog.Error(err.Error())
return
}
var point int64 = 1
for mark := range data {
if err := own.writeData(file, mark, point); err != nil {
slog.Error(err.Error())
return
}
point++
}
// 写入 KML 文件尾部
if err := own.writeTail(file); err != nil {
slog.Error(err.Error())
}
}()
return nil
}
func (own *Kml) WriteToFileFromData(filename string, data [][3]float64) error {
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
// 写入 KML 文件头部
if err := own.writeHead(file); err != nil {
return err
}
// 写入数据点
var point int64 = 1
for _, mark := range data {
if err := own.writeData(file, mark, point); err != nil {
return err
}
point++
}
// 写入 KML 文件尾部
return own.writeTail(file)
}
func (own *Kml) writeHead(file *os.File) error {
head := fmt.Sprintf(`<?xml version="%s" encoding="%s"?>
<kml xmlns="%s" >
<Document>
<Style id="%s" >
<IconStyle>
<scale>
1
</scale>
<Icon>
<href>
%s
</href>
</Icon>
</IconStyle>
</Style>`, own.xmlVer, own.encoding, own.xmlns, own.styleId, own.iconHref)
_, err := file.WriteString(head)
return err
}
func (own *Kml) writeData(file *os.File, data [3]float64, total int64) error {
coordinate := fmt.Sprintf(`
<Placemark>
<name>
Point%d
</name>
<description>
<![CDATA[<TABLE BORDER=1></TABLE> ]]>
</description>
<styleUrl>
</styleUrl>
<Point>
<coordinates>
%f,%f,0
</coordinates>
</Point>
</Placemark>`, total, data[0], data[1])
_, err := file.WriteString(coordinate)
return err
}
func (own *Kml) writeTail(file *os.File) error {
_, err := file.WriteString(`
</Document>
</kml>`)
return err
}
Go
1
https://gitee.com/leminewx/gov2x.git
git@gitee.com:leminewx/gov2x.git
leminewx
gov2x
gov2x
a88e0b321ff7

搜索帮助