文章主题:
🌟在项目需求中,我常需快速生成测试用的经纬度坐标,这一步对于功能验证至关重要。遗憾的是,我的经纬度转平面坐标技能略有欠缺。这时候,我就想到了求助于全能的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) (float64, float64)
{
// 将度数转换为弧度 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
}
AI时代,掌握AI大模型第一手资讯!AI时代不落人后!
免费ChatGPT问答,办公、写作、生活好得力助手!
扫码右边公众号,驾驭AI生产力!