EasyGBS已经加入了摄像头的定位功能,在摄像头设备接入过多时,可以通过经纬度快速定位到不同设备的所处位置。
在某项目中,EasyGBS现场接入数量较大,同时对方需要每个接入点都需要设置准确的经纬度。但一个一个通道的录入经纬度信息,耗时费力,且不能保证录入的准确性,因此需要一个批量导入通道经纬度信息的功能,本文我们就对该功能的实现进行一些分享。
该功能为了方便用户使用,主要是通过web端实现,远程通过规定格式的Excel表格将经纬度信息更新到服务器端。
在该功能的开发中,我们需要注意以下四点:
1.导入信息的通道编号/设备编号和通道名称必须有一个是正确的(此条事项是为了配合现场,理论上该功能应以ID导入必须正确且唯一);
2.如果以通道名称或ID有重复,后者会覆盖前者的的经纬度信息;
3.如果导入表格格式错误,或有空行或空列会直接返回;
4.如果表格中有错误数据,则只录入之前正确的行,并返回错误行信息。
以下为实现功能的参考代码:
func importPosition(file *xlsx.File)error{
for _,sheet := range file.Sheets{
switch sheet.Name {
case "通道经纬度":
if len(sheet.Rows) <=2{
return fmt.Errorf("导入内容为空")
}
//读取单通道经纬度信息
for index,row := range sheet.Rows[2:]{
var channel models.Channel
//读取通道每列信息
for i,cell := range row.Cells{
switch i {
case 0:
channel.DeviceID = cell.String()
case 1:
channel.ID = cell.String()
case 2:
channel.Name = cell.String()
case 3:
f ,err := cell.Float()
if err != nil{
return fmt.Errorf("第%d行 %s经度有误%v",index+3,channel.ID,cell.String())
}
channel.Longitude = f
case 4:
f ,err := cell.Float()
if err != nil{
return fmt.Errorf("第%d行 %s纬度有误%v",index+3,channel.ID,cell.String())
}
channel.Latitude = f
default:
return fmt.Errorf("导入表格列数有误请检查,有未知列")
}
}
if err := models.UpdatePosition(channel); err != nil {
return fmt.Errorf("导入信息第%d行有误,未找到对应通道",index+3)
}
}
}
}
return nil
}