栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

GeoJson压缩和解码算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

GeoJson压缩和解码算法

public static String encodePolygon(List coordinates, int[] encodeOffsets){
    StringBuilder result = new StringBuilder("");
    int prevX = encodeOffsets[0];
    int prevY = encodeOffsets[1];
    for (int i = 0; i < coordinates.size(); i++) {
        List point = (List) coordinates.get(i);
        String x = point.get(0).toString();
        String y = point.get(1).toString();
        result.append(encode(Double.valueOf(x), prevX));
        result.append(encode(Double.valueOf(y), prevY));
        prevX = quantize(Double.valueOf(x));
        prevY = quantize(Double.valueOf(y));
    }
    return result.toString();
}
private static String encode(double d, int prev) {
    // Quantization
    int val = quantize(d);
    // Delta
    val = val - prev;
    if (((val << 1) ^ (val >> 15)) + 64 == 8232) {
        //WTF, 8232 will get syntax error in js code
        val--;
    }
    // ZigZag
    val = (val << 1) ^ (val >> 15);
    // add offset and get unicode

    return String.valueOf((char)(val + 64));
}
public static int quantize(double d) {
    return (int)Math.ceil(d * 1024);
}
private static List decodePolygon(String coordinate, int prevX, int prevY) {
    List result = new ArrayList();

    for (int i = 0; i < coordinate.length(); i += 2) {
        int x = coordinate.toCharArray()[i] - 64;
        int y = coordinate.toCharArray()[i + 1] - 64;
        // ZigZag decoding
        x = (x >> 1) ^ -(x & 1);
        y = (y >> 1) ^ -(y & 1);
        // Delta deocding
        x += prevX;
        y += prevY;

        prevX = x;
        prevY = y;
        // Dequantize
        double[] c = new double[]{(double) x / 1024,(double) y / 1024};
        result.add(c);
    }

    return result;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/305198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号