第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用戈朗更新 KML 文件中的節(jié)點

使用戈朗更新 KML 文件中的節(jié)點

Go
蕭十郎 2022-09-12 15:47:17
我正在使用一個KML文件,我用它來在谷歌地球內(nèi)繪制線串。我正在從 USB 適配器接收 GPS 數(shù)據(jù),并將坐標饋送到 Go 頻道。我正在嘗試讀取通道并更新KML文件中的節(jié)點以添加到線弦中(從而繪制我的移動)。以下是 KML 結(jié)構(gòu):<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"><Folder>    <name>Foo</name>    <open>1</open>    <Document>        <name>Bar</name>        <Placemark>            <Style>                <LineStyle>                    <color>ff00ff00</color>                    <width>5</width>                </LineStyle>                <PolyStyle>                    <color>ff4080ff</color>                    <fill>1</fill>                    <outline>1</outline>                </PolyStyle>            </Style>            <LineString>                <tessellate>1</tessellate>                <coordinates>                    1.23411166666667,10.12345678901234,0                     1.23421166666667,10.12345678901234,0                     1.23431166666667,10.12345678901234,0                     1.23431166666667,10.32345678901234,0                 </coordinates>            </LineString>        </Placemark>    </Document></Folder></kml>我希望追加到坐標節(jié)點。我在想兩種方法之一。首先解析文件并使用正則表達式查找并插入數(shù)據(jù)。其次,解析 XML 并查找更新節(jié)點中的值。后者似乎是更明智的選擇,但是我在Google上搜索的所有內(nèi)容都向我展示了如何將新節(jié)點添加到XML樹中,而不是附加到現(xiàn)有條目中。</coordinates>到目前為止,我所嘗試的感覺就像一團糟,每次從頻道讀取時都低效地打開文件,最終不起作用。type LineString struct {    coordinates string `xml:"coordinates"`}    func plotLocation(c chan data.GpsPos) {    /*        continuously read from the channel        use the location data to plot a breadcrumb trail    */    defer wg.Done()    for currentCoords := range c {        file, err := os.Open("/Users/me/foo.kml")        if err != nil {            log.Fatal(err)        }我是否做了一些明顯錯誤的事情,是否有更好的方法將這些數(shù)據(jù)寫入文件(每秒鐘左右發(fā)生一次)?
查看完整描述

1 回答

?
慕沐林林

TA貢獻2016條經(jīng)驗 獲得超9個贊

文件是否在應(yīng)用程序之外發(fā)生更改?如果沒有,那么您可以在循環(huán)之前解析一次文件,維護坐標列表,并在每次更改時將其寫出,以便外部應(yīng)用程序可以看到中間結(jié)果。如果您計劃執(zhí)行更多轉(zhuǎn)換,或者想要在開始時從頭開始生成整個文件,這也將非常有用。


首先,您需要一個具有適當(dāng)標記的結(jié)構(gòu)(請參見 xml.Unmarshal)。我通常從在線生成器開始進行此類操作:


// type definition adapted from https://www.onlinetool.io/xmltogo/


type KML struct {

    XMLName xml.Name `xml:"kml"`

    Text    string   `xml:",chardata"`

    XMLNS   string   `xml:"xmlns,attr"`

    GX      string   `xml:"gx,attr"`

    KML     string   `xml:"kml,attr"`

    Atom    string   `xml:"atom,attr"`

    Folder  struct {

        Text     string `xml:",chardata"`

        Name     string `xml:"name"`

        Open     string `xml:"open"`

        Document struct {

            Text      string `xml:",chardata"`

            Name      string `xml:"name"`

            Placemark struct {

                Text  string `xml:",chardata"`

                Style struct {

                    Text      string `xml:",chardata"`

                    LineStyle struct {

                        Text  string `xml:",chardata"`

                        Color string `xml:"color"`

                        Width string `xml:"width"`

                    } `xml:"LineStyle"`

                    PolyStyle struct {

                        Text    string `xml:",chardata"`

                        Color   string `xml:"color"`

                        Fill    string `xml:"fill"`

                        Outline string `xml:"outline"`

                    } `xml:"PolyStyle"`

                } `xml:"Style"`

                LineString struct {

                    Text        string `xml:",chardata"`

                    Tessellate  string `xml:"tessellate"`

                    Coordinates string `xml:"coordinates"`

                } `xml:"LineString"`

            } `xml:"Placemark"`

        } `xml:"Document"`

    } `xml:"Folder"`

我會為此做一些幫助:


func readKML(filename string) (*KML, error) {

  f, err := os.Open(filename)

  if err != nil {

    return nil, fmt.Errorf("opening KML file: %w", err) // contains filename

  }

  defer f.Close() // reading, ignoring error is acceptable

  var kml KML

  if err := xml.NewDecoder(f).Decode(&kml); err != nil {

    return nil, fmt.Errorf("decoding XML from %q as KML: %w", filename, err)

  }

  return &kml, nil

}


func writeKML(filename string, kml *KML) error {

  f, err := os.Create(filename)

  if err != nil {

    return fmt.Errorf("creating KML file: %w", err) // contains filename

  }

  defer f.Close() // double close is OK for *os.File

  enc := xml.NewEncoder(f)

  enc.Indent("", "    ")

  if err := enc.Encode(kml); err != nil {

    return nil, fmt.Errorf("encoding KML to %q: %w", filename, err)

  }

  return nil

}

然后你的循環(huán)可以看起來像這樣:


kml, err := readKML(filename)

if err != nil {

  return err // contains context

}


coordinates := strings.Fields(kml.Folder.Document.Placemark.LineString.Coordinates)


for coord := range incoming {

  line := fmt.Sprintf("%f,%f,%d\n", coord.Lat, coord.Long, 0)

  coordinates = append(coordinates, coord)

  

  kml.Folder.Document.Placemark.LineString.Coordinates = strings.Join(coordinates, "\n")

  if err := writeKML(filename, kml); err != nil {

    log.Printf("Warning: failed to update %q: %s", filename, err)

  }

}

在查看您擁有的代碼時,我懷疑問題在于您正在延遲文件關(guān)閉,這將在函數(shù)返回時執(zhí)行,而不是在循環(huán)繼續(xù)時執(zhí)行。您也可以使此方法正常工作,為此,我建議將邏輯分解為函數(shù),以便可以獨立測試每個部分,這也可能意味著您的延遲現(xiàn)在已在函數(shù)中正確限定。


查看完整回答
反對 回復(fù) 2022-09-12
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號