如何编写一个在环形范围内随机生成经纬度坐标的Go代码?

文心一言 2年前 (2023) lida
59 0 0

文章主题:

666ChatGPT办公新姿势,助力做AI时代先行者!

🌟在项目需求中,我常需快速生成测试用的经纬度坐标,这一步对于功能验证至关重要。遗憾的是,我的经纬度转平面坐标技能略有欠缺。这时候,我就想到了求助于全能的ChatGPT,它能轻松搞定这类数学转换。

我的目标是编写一个方法,它以指定的经纬度坐标为中心,在指定半径内生成随机的经纬度坐标。

🌟 ChatGPT 创新尝试!🚀 一款潜在的编程工具展示了令人鼓舞的能力——它能编译代码。然而,当我实际操作中检验其准确性时,遭遇了意外的小挫折:生成的坐标系统并未遵循规范路径。🚫尽管初期表现引人关注,但这一发现促使我们深入调查,以确保方法在实际应用中的精确性。修正错误并优化算法是接下来的关键步骤。💻对于寻求高效且合法坐标解决方案的开发者们,这可能是一个暂时的挑战,但我们坚信 ChatGPT 的潜力远大于此。迭代改进,未来可期!🚀记得,技术之路并非一帆风顺,但每一次调整都向着更完善前进。保持耐心,我们与ChatGPT一起,迎接更好的明天!🌈

🎉🚀经过不懈的努力与精准打磨,我们终于在第三次迭代中锁定了项目目标,成功实现了单元测试覆盖。下面是关键路径的精华所在——高质量代码示例,它满足了所有预设需求。悄咪咪地,ChatGPT为我们揭示了每一个代码片段背后的深意,助力我们精雕细琢。最终的成品,不仅技术过硬,而且SEO优化得当,等待着被搜索引擎发现和赞赏。别忘了,精彩尽在文末哦!🔍💻

第一轮对话:

我:

请使用 golang 写一个以指定经纬度坐标为中心,在指定半径内随机经纬度坐标的方法。

ChatGPT:

【ChatGPT 给出的代码会输出不合法的坐标,代码略。。。】

第二轮对话,要求写单元测试:

我向 ChatGPT 强调了“一定要保证方法的准确性”,并且要求它写单元测试。

我:

🌟你需要一个用 göngolang 编写的精巧工具吗?🔍想要生成一组随机,但又符合特定经纬度中心范围内的坐标?没问题!下面是一个高效且精准的解决方案,让你轻松实现这一目标。👩‍💻“`go// 定义函数,接收经纬度中心和半径作为参数func generateRandomCoordinates(centerLat, centerLon, radius float64) ([][2]float64, error) { // 使用Go语言内置的math/rand和geom库确保随机性与准确性 rand := math/rand.NewSource(time.Now().UnixNano()) geom, err := geofence.NewRandom(centerLat, centerLon, radius, rand) if err != nil { return nil, fmt.Errorf(“Error generating random coordinates: %v”, err) } // 生成随机坐标列表 coords := geom.Coordinates() return coords, nil}“`这个函数通过`geom.NewRandom`方法,基于给定的经纬度中心和半径范围,生成了一组均匀分布的坐标点。它确保了每次调用都能提供准确无误的结果。🚀欲了解更多关于如何在Go中处理地理空间数据的信息,记得查阅相关文档或教程。如果你有任何问题,或者需要进一步优化,请随时提问!💪SEO优化提示:使用Golang、随机经纬度坐标生成、地理空间API、geofencing等关键词。

ChatGPT:

【代码不符合,略。。。】

我:

请针对以上方法写单元测试。

ChatGPT:

【单测代码略。。。】

🎉💡尽管单元测试一切顺利,但我注意到一个微妙的问题——点的位置过于集中,均围绕中心点附近波动。这对于期望中的均匀环状分布来说,显然是不够理想的。🌟🎯为确保精确性与一致性,我亟需调整测试以实现坐标分布在理想的圆形区域内。 yazın

所以我给 ChatGPT 的任务应该是“在环形范围内随机坐标”,并且单元测试也需要做出相应修改。

最终轮对话,单元测试不过,继续改:

我:

🌟编写高质量的Golang代码是一项必备技能!想要生成特定范围内的随机经纬度?没问题!下面是优化过的指令:💡你需要创建一个Go函数,输入为经纬度中心和半径范围(最大-最小),返回值是该范围内随机的一个经纬度坐标。务必确保算法精确无误!🔍以下是实现这一功能的代码示例,注意保护隐私并移除个人标识:“`gofunc randomCoordinate(centerLat, centerLong, maxRadius, minRadius float64) (lat, long float64) { randLat := rand.Float64()*(maxRadius-minRadius) + minRadius randLong := rand.Float64()*(maxRadius-minRadius) + minRadius // 使用经纬度转换公式生成随机坐标 lat = centerLat + randLat * math.Pi / 180 long = centerLong + randLong * math.Pi / 180 return lat, long}“`这段代码简洁高效,适用于SEO优化。记得在实际项目中替换`randFloat64()`为适当的随机数生成器。💪—请确保你的Golang函数遵循最佳实践,同时保持算法的精确性。这样,无论何时需要随机经纬度坐标,你都有了可靠的工具!

ChatGPT:

【代码不符合,略。。。】

我:

为这个方法编写单元测试

ChatGPT:

【单测代码略。。。】

我把单元测试失败的信息丢给了它:

— FAIL: TestGenerateRandomLocation (0.00s) loc_test.go:65: generateRandomLocation: invalid distance – 1.2216872422188303e+07 loc_test.go:60: generateRandomLocation: invalid latitude or longitude – (-52.440390660709674, 287.77479064698946)

ChatGPT:

【它分析了可能出现问题的点,并建议我打日志或者Debug来查找问题所在。它的具体回答略。。。】

不得不说 ChatGPT 真鸡贼。它写的代码,让我Debug,没这个可能!

我:

请你根据我以上给出的单元测试结果,修改上面的方法

ChatGPT:

非常感谢您提供的测试结果!根据测试结果,我们可以发现随机生成的经纬度坐标有问题,主要是由于我们生成的随机距离不正确。在下面的代码中,我尝试使用了另一种方法来生成随机距离,并对generateRandomLocation方法进行了一些修改,以解决生成随机经纬度坐标的问题:【完整代码见文末】

经过这次修改,generateRandomLocation方法通过了单元测试,所产生的随机坐标也帮我完成了工作。

总结

每次使用 ChatGPT 都能让我有新的感受。这一次,让我意识到了两个如何更好地使用 ChatGPT 的方面:

利用单元测试来驱动 ChatGPT 完善代码。在开发过程中,采用”测试驱动开发(TDD)”的方法,是否也可以应用在 ChatGPT 上呢?

从编码者转变为产品经理:产品经理使用自然语言或多媒体方式向开发人员描述需求,而开发人员则被动接受。现在,在使用 ChatGPT 时,必须转变思维方式,以产品经理的角度向 ChatGPT 下达任务。

关注公众号,获取最新分享!

最终代码

// 生成在最大半径和最小半径之间的随机经纬度坐标func generateRandomLocation(latitude, longitude, maxRadius, minRadius float64) (float64float64)

 {

    // 将度数转换为弧度    lat := latitude * math.Pi / 180.0    long := longitude * math.Pi / 180.0    // 生成一个在最大半径和最小半径范围内的随机距离

    r := rand.Float64()

    distance := math.Sqrt(r*(maxRadius*maxRadius-minRadius*minRadius) + minRadius*minRadius)

    // 生成一个在0到2π之间的随机角度    angle := rand.Float64() * 2

 * math.Pi

    // 计算新的纬度和经度    newLat := math.Asin(math.Sin(lat)*math.Cos(distance/6371000) + math.Cos(lat)*math.Sin(distance/6371000

)*math.Cos(angle))

    newLong := long + math.Atan2(math.Sin(angle)*math.Sin(distance/6371000)*math.Cos(lat), math.Cos(distance/6371000

)-math.Sin(lat)*math.Sin(newLat))

    // 将新的纬度和经度转换为度数    newLat = newLat * 180.0

 / math.Pi

    newLong = newLong * 180.0

 / math.Pi

    // 调整经度范围    if newLong < -180

 {

        newLong += 360    } else if newLong > 180

 {

        newLong -= 360

    }

    return

 newLat, newLong

}

单元测试代码如下:

package

 main

import

 (

    “math”    “testing”

)

// 测试generateRandomLocation方法是否正确生成了在最大半径和最小半径之间的随机经纬度坐标func TestGenerateRandomLocation(t *testing.T)

 {

    latitude := 39.9    longitude := 116.4    maxRadius := 1000.0    minRadius := 500.0    for i := 0; i < 1000

; i++ {

        newLat, newLong := generateRandomLocation(latitude, longitude, maxRadius, minRadius)

        // 检查新生成的纬度和经度是否在合法范围内        if newLat < -90 || newLat > 90 || newLong < -180 || newLong > 180

 {

            t.Errorf(“generateRandomLocation: invalid latitude or longitude – (%v, %v)”

, newLat, newLong)

        }

        // 检查新生成的点距离原点是否在[minRadius, maxRadius]范围内

        distance := haversineDistance(latitude, longitude, newLat, newLong)

        if

 distance < minRadius || distance > maxRadius {

            t.Errorf(“generateRandomLocation: invalid distance – %v”

, distance)

        }

    }

}

// 计算地球上两个经纬度坐标之间的距离func haversineDistance(lat1, long1, lat2, long2 float64) float64

 {

    // 将度数转换为弧度    lat1 = lat1 * math.Pi / 180.0    long1 = long1 * math.Pi / 180.0    lat2 = lat2 * math.Pi / 180.0    long2 = long2 * math.Pi / 180.0    // 计算两点之间的距离

    dlat := lat2 – lat1

    dlong := long2 – long1

    a := math.Pow(math.Sin(dlat/2), 2) + math.Cos(lat1)*math.Cos(lat2)*math.Pow(math.Sin(dlong/2), 2

)

    c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1

-a))

    distance := 6371000.0

 * c

    return

 distance

}

如何编写一个在环形范围内随机生成经纬度坐标的Go代码?

如何编写一个在环形范围内随机生成经纬度坐标的Go代码?

AI时代,掌握AI大模型第一手资讯!AI时代不落人后!

免费ChatGPT问答,办公、写作、生活好得力助手!

扫码右边公众号,驾驭AI生产力!

版权声明:lida 发表于 2023年4月28日 pm12:03。
转载请注明:如何编写一个在环形范围内随机生成经纬度坐标的Go代码? | ChatGPT资源导航

相关文章