代码拉取完成,页面将自动刷新
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
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。