* @function Label.prototype.getDrawnLabels * @description 获取经(压盖)处理后将要绘制在图层上的标签要素。 * @param {Array. } labelFeatures - 所有标签要素的数组。 * @returns {Array. } 最终要绘制的标签要素数组。
(labelFeatures)
| 167 | * @returns {Array.<FeatureVector>} 最终要绘制的标签要素数组。 |
| 168 | */ |
| 169 | getDrawnLabels(labelFeatures) { |
| 170 | var feas = [], //最终要绘制的标签要素集 |
| 171 | fea, //最终要绘制的标签要素 |
| 172 | fi, //临时标签要素,用户的第i个标签 |
| 173 | labelsB = [], //不产生压盖的标签要素范围集 |
| 174 | styTmp, //用于临时存储要素style的变量 |
| 175 | feaSty, //标签要素最终的style |
| 176 | // styleTemp用于屏蔽文本style中带有偏移性质style属性,偏移已经在计算bounds的过程中参与了运算, |
| 177 | // 所以在最终按照bounds来绘制标签时,需屏蔽style中带有偏移性质属性,否则文本的偏移量将扩大一倍。 |
| 178 | styleTemp = { |
| 179 | labelAlign: "cm", |
| 180 | labelXOffset: 0, |
| 181 | labelYOffset: 0 |
| 182 | }; |
| 183 | |
| 184 | var map = this.map; |
| 185 | var mapSize = map.getSize(); |
| 186 | mapSize = { |
| 187 | x: mapSize[0], |
| 188 | y: mapSize[1] |
| 189 | }; |
| 190 | var zoom = map.getView().getZoom(); |
| 191 | //对用户的每个标签要素进行处理与判断 |
| 192 | for (var i = 0, len = labelFeatures.length; i < len; i++) { |
| 193 | fi = labelFeatures[i]; |
| 194 | //检查fi的style在避让中是否被改变,如果改变,重新设置要素的style |
| 195 | if (fi.isStyleChange) { |
| 196 | fi = this.setStyle(fi); |
| 197 | } |
| 198 | |
| 199 | //标签最终的中心点像素位置 (偏移后) |
| 200 | var loc = this.getLabelPxLocation(fi); |
| 201 | |
| 202 | //过滤掉地图范围外的标签 (偏移后) |
| 203 | if ((loc.x >= 0 && loc.x <= mapSize.x) && (loc.y >= 0 && loc.y <= mapSize.y)) { |
| 204 | //根据当前地图缩放级别过滤标签 |
| 205 | if (fi.style.minZoomLevel > -1) { |
| 206 | if (zoom <= fi.style.minZoomLevel) { |
| 207 | continue; |
| 208 | } |
| 209 | } |
| 210 | if (fi.style.maxZoomLevel > -1) { |
| 211 | if (zoom > fi.style.maxZoomLevel) { |
| 212 | continue; |
| 213 | } |
| 214 | } |
| 215 | |
| 216 | //计算标签bounds |
| 217 | var boundsQuad = null; |
| 218 | if (fi.isStyleChange) { |
| 219 | fi.isStyleChange = null; |
| 220 | boundsQuad = this.calculateLabelBounds(fi, loc); |
| 221 | } else { |
| 222 | if (fi.geometry.bsInfo.w && fi.geometry.bsInfo.h) { |
| 223 | //使用calculateLabelBounds2可以提高bounds的计算效率,尤其是在getPxBoundsMode = 1时 |
| 224 | boundsQuad = this.calculateLabelBounds2(fi, loc); |
| 225 | } else { |
| 226 | boundsQuad = this.calculateLabelBounds(fi, loc); |
no test coverage detected