压缩geojson(php版)

GeoJSON是一种对各种地理数据结构进行编 码的格式,可以表示几何、特征或者特征集合。

点 {"type":"Point","coordinates":[6,10]}

线 {"type":"LineString","coordinates":[[44, 4],[11, 44],[33, 25]]}

面 {"type":"Polygon","coordinates":[[[1, 1],[2, 2],[3, 3],[4, 4],[5, 5],[1, 1]],[[11, 11],[2, 13],[34, 43],[34, 42],[52, 52],[11, 11]]]}

多点 {"type":"MultiPoint","coordinates":[[44, 4],[11, 44],[33, 25]]}

多线 {"type":"MultiLineString","coordinates":[[[3, 4],[10, 50],[20, 25]],[[-5, -8],[-10, -8],[-15, -4]]}

多面 {"type":"MultiPolygon","coordinates":[[[3, 4],[10, 50],[20, 25]],[[-5, -8],[-10, -8],[-15, -4]]]}

几何集合 {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[4,6]},},{"type":"Feature","geometry":{"type":"LineString","coordinates":[[[4,6],[7,10]]}]}

 

数据格式:

geoJson: {"type":"MultiPolygon","coordinates":[[[[1,1],[5,1],[5,5],[1,5],[1,1]],[[2,2],[2,3],[3,3],[3,2],[2,2]]],[[[6,3],[9,2],[9,4],[6,3]]]]}

 

原文章是js版,现在写一个php版,(根据js版转换)

/**
 * 压缩coordinate
 */
function encodePolygon($coordinate, &$encodeOffsets) {

    $result = '';



    $prevX = quantize($coordinate[0][0]);

    $prevY = quantize($coordinate[0][1]);

    $encodeOffsets[0] = $prevX;

    $encodeOffsets[1] = $prevY;



    for ($i = 0; $i < count($coordinate); $i++) {

        $point = $coordinate[$i];

        $result .= encode($point[0], $prevX);

        $result .= encode($point[1], $prevY);



        $prevX = quantize($point[0]);

        $prevY = quantize($point[1]);

    }



    return $result;

}



function encode($val, $prev) {

    $val = quantize($val);

    $val = $val - $prev;



    if ((($val << 1) ^ ($val >> 15)) + 64 === 8232) {

        $val--;

    }

    $val = ($val << 1) ^ ($val >> 15);

    return chr($val + 64);

}



function quantize($val) {

    return ceil($val * 1024);

}

//测试写的编码方法  

function encodeCoordinate(&$json){  

    $feature = &$json;  

    $coordinates = &$feature->geometry->coordinates;  

    $encodeOffsets = &$feature->geometry->encodeOffsets;  

  

    for ($c = 0; $c < count($coordinates); $c++) {  

        $coordinate = &$coordinates[$c];  

  

        if ($feature->geometry->type === 'Polygon') {  

            $coordinates[$c] = encodePolygon(  

                    $coordinate,  

                    $encodeOffsets[$c]  

            );  

        } else if ($feature->geometry->type === 'MultiPolygon') {  

            for ($c2 = 0; $c2 < count($coordinate); $c2++) {  

                $polygon = $coordinate[$c2];  

                $coordinate[$c2] = encodePolygon(  

                        $polygon,  

                        $encodeOffsets[$c][$c2]  

                );  

            }  

        }  

    }  

    return $feature;  

} 

 

补充:

数据格式:

wkt: MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))

WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known-binary)则胜于在传输和在数据库中存储相同的信息。

点 POINT(6 10)

线 LINESTRING(44 4,11 44,33 25)

面 POLYGON((1 1,2 2,3 3,4 4,5 5,1 1),(11 11,2 13,34 43,34 42,52 52,11 11))

多点 MULTIPOINT(44 4,11 44,33 25)

多线 MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))

多面 MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))

几何集合 GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值