现在的位置: 首页 > 综合 > 正文

Flex 中google map 多边形的编码折线

2013年04月25日 ⁄ 综合 ⁄ 共 1174字 ⁄ 字号 评论关闭

google map中Polygon提供了一个静态方法fromEncoded来生成polygon。。最要命的就是要通过什么编码折线将经纬度换算成Base64的ASCII,http://code.google.com/intl/zh-CN/apis/maps/documentation/utilities/polylinealgorithm.html这个是官方的编码方法,其实就是将double换成字符,省掉几个字节,这时的经纬度的精度已经变了。。现在的机器应该能够承受这几个字节吧。

现在看一下AS编码算法

private function CreateEncode(point:Number):String
{
var p:int = int(point*100000);
p = p<<1;
if(p<0)
p = ~p;
var rs:String = "";  
while(p>=0x20)
{
var block:int = p & 0x1F;
block = (block | 0x20) + 63;
rs += String.fromCharCode(block);
p = p >>> 5;
 
}
rs += String.fromCharCode(p+63);
return rs;
}
private function EncodeLatLng(latlng:LatLng):String
{
var lat:String = CreateEncode(latlng.lat());
var lng:String = CreateEncode(latlng.lng());
return lat+lng;
}

计算出一个经纬度的编码,

private function EncodePolygon(arr:Array,polygonopt:PolygonOptions = null):Polygon
{
var s:String = "";
var next:LatLng;
var level:String="";
for(var i:int=0;i<arr.length;i++)
{
if(i==0)
{
s += EncodeLatLng(arr[0]);
}
else
{
s += EncodeLatLng(new LatLng(arr[i].lat()-next.lat(),arr[i].lng()-next.lng()));//第一个是经纬度的编码,后面的是偏移量的编码
}
next = arr[i];
level+="P";//级别编码
}
var en:EncodedPolylineData = new EncodedPolylineData(s,2,level,18);
var polygon:Array = [];
polygon.push(en);
return Polygon.fromEncoded(polygon,polygonopt);
}

这个函数是将经纬度的数组画成一个polygon,返回一个polygon。

抱歉!评论已关闭.