gpt4 book ai didi

go - 如何在 golang 中解析 ISO6709 坐标?

转载 作者:IT王子 更新时间:2023-10-29 02:32:41 25 4
gpt4 key购买 nike

来自维基百科的一些例子 ISO 6709 :

Atlantic Ocean +00-025/
France +46+002/
Paris +48.52+002.20/
Eiffel Tower +48.8577+002.295/
Mount Everest +27.5916+086.5640+8850CRSWGS_84/
North Pole +90+000/
Pacific Ocean +00-160/
South Pole -90+000+2800CRSWGS_84/
United States +38-097/
New York City +40.75-074.00/
Statue of Liberty +40.6894-074.0447/

既然没有一致的定界符,怎么解析呢?正则表达式?逐字节读取并解析?

澄清一下:所需的输出是一对 float32 纬度和经度。例如:

输入:+40.6894-074.0447/
输出:40.6894 和 -074.0447

最佳答案

我不确定您想要提取哪些部分,但以下正则表达式在您的示例中起作用以选择它们。

(\+|-)\d+\.?\d+(\+|-)\d+\.?[\d]+(\+|-)?[^/]*

它确实是分段解决的,并且取决于最后一个/作为终止符,但如果不是,还有其他解决方法。

(\+|-)\d+\.?\d+(\+|-)\d+\.?\d+(\+|-)?[A-Z_\d]*

不依赖于/终止符。

要提供完美的答案,需要坐标的上下文。

这里是要实现的代码,给定一个字符串作为输入:

import (
"fmt"
"regexp"
)

func main() {
toSearch := "Atlantic Ocean +00-025/\nFrance +46+002/\nParis +48.52+002.20/\nEiffel Tower +48.8577+002.295/\nMount Everest +27.5916+086.5640+8850CRSWGS_84/\nNorth Pole +90+000/\nPacific Ocean +00-160/\nSouth Pole -90+000+2800CRSWGS_84/\nUnited States +38-097/\nNew York City +40.75-074.00/\nStatue of Liberty +40.6894-074.0447/"
ISOCoord := regexp.MustCompile(`(\+|-)\d+\.?\d+(\+|-)\d+\.?\d+(\+|-)?[A-Z_\d]*`)
result := ISOCoord.FindAll([]byte(toSearch), 11)
for _, v := range result {
fmt.Printf("%s\n", v)
}
}

返回:

+00-025
+46+002
+48.52+002.20
+48.8577+002.295
+27.5916+086.5640+8850CRSWGS_84
+90+000
+00-160
-90+000+2800CRSWGS_84
+38-097
+40.75-074.00
+40.6894-074.0447

鉴于您想要 2 个单独的坐标的新想法,此方法有效:

import (
"fmt"
"regexp"
"strconv"
)

type coord struct {
lat, long float64
}

func main() {
toSearch := "Atlantic Ocean +00-025/\nFrance +46+002/\nParis +48.52+002.20/\nEiffel Tower +48.8577+002.295/\nMount Everest +27.5916+086.5640+8850CRSWGS_84/\nNorth Pole +90+000/\nPacific Ocean +00-160/\nSouth Pole -90+000+2800CRSWGS_84/\nUnited States +38-097/\nNew York City +40.75-074.00/\nStatue of Liberty +40.6894-074.0447/"
ISOCoord := regexp.MustCompile(`((\+|-)\d+\.?\d*){2}`)
result := ISOCoord.FindAllString(toSearch, -1)
INDCoord := regexp.MustCompile(`(\+|-)\d+\.?\d*`)
answer := make([]coord, 11)

for i, v := range result {
temp := INDCoord.FindAllString(v, 2)
lat, _ := strconv.ParseFloat(temp[0], 64)
lon, _ := strconv.ParseFloat(temp[1], 64)
answer[i] = coord{lat, lon}
}
fmt.Println(answer)
}

正则表达式加倍,因此它更健壮,但如果可能的话,只执行一次会更快。

代码还应该对转换进行错误检查,但您可以添加它。

还值得注意的是,它修剪 0。如果你想按照规定维护那些,即。如果 012.1 与 12.1 不同,您可以忽略转换为 float 并使用字符串。

代码生成 float :

[{0 -25} {46 2} {48.52 2.2} {48.8577 2.295} {27.5916 86.564} {90 0} {0 -160} {-90 0} {38 -97} {40.75 -74} {40.6894 -74.0447}]

[{+00 -025} {+46 +002} {+48.52 +002.20} {+48.8577 +002.295} {+27.5916 +086.5640} {+90 +000} {+00 -160} {-90 +000} {+38 -097} {+40.75 -074.00} {+40.6894 -074.0447}]

作为字符串

关于go - 如何在 golang 中解析 ISO6709 坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43430004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com