【发布时间】:2018-01-27 06:44:38
【问题描述】:
Google Maps iOS SDK 的热图(更具体地说是Google-Maps-iOS-Utils framework)主要通过计算该区域中点的密度来决定渲染该区域的颜色。
但是,我想根据该区域中点的平均重量或强度来选择颜色。
据我了解,这种行为不是内置的(但谁知道呢——文档有点烂)。决定颜色选择的文件是我认为 in /src/Heatmap/GMUHeatmapTileLayer.m这是一个相对较短的文件,但我不太精通Objective-C,所以我很难弄清楚做什么做什么。我认为GMUHeatmapTileLayer.m中的-tileForX:y:zoom:是重要的功能,但我不确定,即使是,我也不知道如何修改它。在此方法的最后,数据首先水平“卷积”,然后垂直“卷积”。我认为这是实际计算强度的地方。不幸的是,我不知道它到底在做什么,而且我害怕改变东西,因为我对 obj-c 很烂。这是这个方法的卷积部分的样子:
- (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom {
// ...
// Convolve data.
int lowerLimit = (int)data->_radius;
int upperLimit = paddedTileSize - (int)data->_radius - 1;
// Convolve horizontally first.
float *intermediate = calloc(paddedTileSize * paddedTileSize, sizeof(float));
for (int y = 0; y < paddedTileSize; y++) {
for (int x = 0; x < paddedTileSize; x++) {
float value = intensity[y * paddedTileSize + x];
if (value != 0) {
// convolve to x +/- radius bounded by the limit we care about.
int start = MAX(lowerLimit, x - (int)data->_radius);
int end = MIN(upperLimit, x + (int)data->_radius);
for (int x2 = start; x2 <= end; x2++) {
float scaledKernel = value * [data->_kernel[x2 - x + data->_radius] floatValue];
// I THINK THIS IS WHERE I NEED TO MAKE THE CHANGE
intermediate[y * paddedTileSize + x2] += scaledKernel;
// ^
}
}
}
}
free(intensity);
// Convole vertically to get final intensity.
float *finalIntensity = calloc(kGMUTileSize * kGMUTileSize, sizeof(float));
for (int x = lowerLimit; x <= upperLimit; x++) {
for (int y = 0; y < paddedTileSize; y++) {
float value = intermediate[y * paddedTileSize + x];
if (value != 0) {
int start = MAX(lowerLimit, y - (int)data->_radius);
int end = MIN(upperLimit, y + (int)data->_radius);
for (int y2 = start; y2 <= end; y2++) {
float scaledKernel = value * [data->_kernel[y2 - y + data->_radius] floatValue];
// I THINK THIS IS WHERE I NEED TO MAKE THE CHANGE
finalIntensity[(y2 - lowerLimit) * kGMUTileSize + x - lowerLimit] += scaledKernel;
// ^
}
}
}
}
free(intermediate);
// ...
}
这是每次迭代计算强度的方法,对吧?如果是这样,我该如何改变它以达到我想要的效果(平均,而不是总结颜色,我认为它与强度成正比)。
那么:如何通过修改框架来平均而不是求和强度?
【问题讨论】:
标签: ios objective-c google-maps heatmap