从总体上看，任务自动分配可以分为两部分，一个是分配工作区域，另一个是分配数据。

# 分配工作区域

目前工作工作区域分配的前提是用户已经上传了包含整个工作区域信息的 Shapefile。

如果用户设置了 [Geohash](https://halfrost.com/go_spatial_search/) 精度，将整个工作区域的外接矩形按照用户选择的精度划分为若干个 Geohash 网格（如果按照用户选择的精度划分出的网格数量小于外业人员数量，则尝试将精度加 1 后再次划分），然后将这些网格尽可能平均地分配给外业人员。

如果用户没有指定 Geohash 精度，则按照以下方法将 Shapefile 中的多边形分配给外业人员：

1. 如果多边形数量等于外业人员数量，随机分配；
2. 如果多边形数量大于 1 但小于外业人员数量，以多边形的面积为权重进行分配，即多边形的面积越大，分配到的人员数量就越多；
3. 如果多边形数量大于外业人员数量，对多边形进行 k-means 聚类，类簇数量等于外业人员数量，然后随机分配每个类簇；
4. 如果只有一个多边形而且外业人员数量大于 1，将这个多边形的外接矩形按照合适的 Geohash 精度划分为若干个网格，然后将这些网格尽可能平均地分配给外业人员；确定 Geohash 精度的原则是保证划分后得到的网格数量不小于外业人员数量。

# 分配数据

如果用户提前导入了一些数据，则需要按照以下方法分配数据：

1. 如果只有一个外业人员，将所有数据都分配给该人员；
2. 如果外业人员数量大于 1，首先计算每个数据的质心（坐标相同的质心只保留一个），然后按照以下方法分配：
   1. 如果质心数量小于外业人员数量，将所有数据尽可能平均地分配给外业人员；
   2. 否则，将质心进行聚类，类簇数量等于外业人员数量，然后随机分配每个类簇。