| | |
| | | "fmt" |
| | | "regexp" |
| | | "ruleModelEngine/db" |
| | | "strings" |
| | | "time" |
| | | ) |
| | | |
| | |
| | | return rules[1].Name |
| | | } |
| | | |
| | | // 获取常用地址 |
| | | func getfrAddress(pointAddress map[string]int) string { |
| | | maxCount := 0 |
| | | maxCountAddress := "" |
| | | re, _ := regexp.Compile(`\b1F\b`) |
| | | for address, count := range pointAddress { |
| | | matchFlag := re.MatchString(address) |
| | | if address == "" || matchFlag == true { |
| | | continue |
| | | } |
| | | if count > maxCount { |
| | | maxCount = count |
| | | maxCountAddress = address |
| | | } |
| | | } |
| | | return maxCountAddress |
| | | } |
| | | |
| | | // SetFrequentAddress 方法计算出现最频繁的出行地址并设置为常用地址 |
| | | func GetFrequentAddress(captureDetail []db.CaptureDetail) string { |
| | | outAddressCounts := make(map[string]int) |
| | | inAddressCounts := make(map[string]int) |
| | | // 统计每个出行地址的出现次数 |
| | | for _, detail := range captureDetail { |
| | | if detail.Direction == "out" { |
| | | outAddressCounts[detail.CaptureAddress]++ |
| | | } |
| | | if detail.Direction == "in" { |
| | | inAddressCounts[detail.CaptureAddress]++ |
| | | } |
| | | } |
| | | |
| | | // 找到出现次数最多的出行地址 |
| | | maxOutCount := 0 |
| | | maxTotalCount := 0 |
| | | var frequentAddress string |
| | | floor1AddressCount := 0 |
| | | pointDate := "" |
| | | pointAddress := make(map[string]int, 0) |
| | | dateAddress := make(map[string]string, 0) |
| | | floor1Address := "" |
| | | for address, count := range outAddressCounts { |
| | | maxTotalCount = maxTotalCount + count |
| | | re, _ := regexp.Compile(`\b1F\b`) |
| | | if re.MatchString(address) { |
| | | if count > floor1AddressCount { |
| | | floor1Address = address |
| | | floor1AddressCount = count |
| | | captureDays := make(map[string]int, 0) |
| | | var frequentAddress string |
| | | re, _ := regexp.Compile(`\b1F\b`) |
| | | for index, detail := range captureDetail { |
| | | //fmt.Println("抓拍地址:", detail.CaptureAddress) |
| | | //fmt.Println("抓拍日期:", detail.CaptureDate) |
| | | dateStr := strings.Split(detail.CaptureDate, " ")[0] |
| | | captureDays[dateStr]++ |
| | | matchFlag := re.MatchString(detail.CaptureAddress) |
| | | if matchFlag { |
| | | floor1Address = detail.CaptureAddress |
| | | } |
| | | //判断日期标是否满足条件 |
| | | if pointDate == "" { |
| | | pointDate = dateStr |
| | | pointAddress[detail.CaptureAddress]++ |
| | | //若为最后一条则计算常用地址 |
| | | if index == len(captureDetail)-1 { |
| | | //fmt.Println("处理前pointAddress表:", pointAddress) |
| | | dateAddress[pointDate] = detail.CaptureAddress |
| | | } |
| | | continue |
| | | } |
| | | //若日期标相等则为同一天,地址标数组楼层计数+1 |
| | | if pointDate == dateStr { |
| | | pointAddress[detail.CaptureAddress]++ |
| | | if index == len(captureDetail)-1 { |
| | | //fmt.Println("处理前pointAddress表:", pointAddress) |
| | | dateAddress[pointDate] = getfrAddress(pointAddress) |
| | | } |
| | | //不相等则为新的日期,首先计算出当日的常用地址,然后重新初始化日期标和地址标数组 |
| | | } else { |
| | | if index == len(captureDetail)-1 { |
| | | pointAddress[detail.CaptureAddress]++ |
| | | //fmt.Println("处理前pointAddress表:", pointAddress) |
| | | dateAddress[pointDate] = getfrAddress(pointAddress) |
| | | continue |
| | | } |
| | | } |
| | | if count > maxOutCount { |
| | | maxOutCount = count |
| | | frequentAddress = address |
| | | dateAddress[pointDate] = getfrAddress(pointAddress) |
| | | pointDate = dateStr |
| | | pointAddress = make(map[string]int, 0) |
| | | } |
| | | } |
| | | |
| | | if frequentAddress == "" && floor1Address != "" { |
| | | //fmt.Println("抓拍地址待处理结构表:", dateAddress) |
| | | //fmt.Println("dareAddress len: ", len(dateAddress)) |
| | | if float64(len(dateAddress))/float64(len(captureDays))*100 >= 50 { |
| | | addressCount := make(map[string]int) |
| | | for _, address := range dateAddress { |
| | | addressCount[address]++ |
| | | } |
| | | frequentAddress = getfrAddress(addressCount) |
| | | } else { |
| | | frequentAddress = floor1Address |
| | | } |
| | | if frequentAddress != "" && floor1Address != "" { |
| | | if (float64(floor1AddressCount)/float64(maxTotalCount))*100 > 90 { |
| | | frequentAddress = floor1Address |
| | | } |
| | | } |
| | | |
| | | if frequentAddress == "" { |
| | | maxInCount := 0 |
| | | for address, count := range inAddressCounts { |
| | | if count > maxInCount { |
| | | maxInCount = count |
| | | frequentAddress = address |
| | | } |
| | | } |
| | | frequentAddress = floor1Address |
| | | } |
| | | //fmt.Println("in address: ", inAddressCounts) |
| | | //fmt.Println("out address: ", outAddressCounts) |