Androidアプリにルート表示する(その3)
apiから取得したpolylineをデコードする。
googleからエンコード化ポリライン アルゴリズム方式が公開されているので、この記述に従ってエンコーダを書いてみたが結果が同じにならず、デバッガで追い掛けながら、あーだこーだと相当苦労した。
結論としては、この文書の記述は不正確な部分や端折ってある部分のある事が判明。
以下コードは、色々な経緯度で試してみましたが、完全である保障は無いので注意ください。
private static StringBuffer encoderPosi(int num)
{
ArrayList<Byte> bit =new ArrayList<Byte>();
StringBuffer ret = new StringBuffer();
{
googleからエンコード化ポリライン アルゴリズム方式が公開されているので、この記述に従ってエンコーダを書いてみたが結果が同じにならず、デバッガで追い掛けながら、あーだこーだと相当苦労した。
結論としては、この文書の記述は不正確な部分や端折ってある部分のある事が判明。
以下コードは、色々な経緯度で試してみましたが、完全である保障は無いので注意ください。
private static StringBuffer encoderPosi(int num)
{
ArrayList<Byte> bit =new ArrayList<Byte>();
StringBuffer ret = new StringBuffer();
num=num<<1;
if(num <0) //負値の場合はビット反転 {
num=~num;
}
for(int i=0;i<6;i++) //5bit毎に分割num=~num;
}
{
bit.add((byte)(num&0x1f));
num=num>>>5;
}
for(int i=bit.size()-1;i>=0;i--) //不要な0データ削除
{
}
for(int i=bit.size()-1;i>=0;i--) //不要な0データ削除
{
byte n=bit.get(i);
if(n==0){
bit.remove(i);
}else{
break;
}
}
for(int i=0;i<bit.size()-1;i++) //0x20論理和(最終データは除く)
{
for(int i=0;i<bit.size()-1;i++) //0x20論理和(最終データは除く)
{
bit.set(i, (byte) (bit.get(i)|0x20));
}
for(int i=0;i<bit.size();i++) //63加算
{
bit.set(i, (byte) (bit.get(i)+63));
if(bit.get(i)=='\\') //バックスラッシュ時の処理
}
for(int i=0;i<bit.size();i++) //63加算
{
bit.set(i, (byte) (bit.get(i)+63));
if(bit.get(i)=='\\') //バックスラッシュ時の処理
{
bit.add(i+1, (byte) '\\');
i++;
}
}
for(int i=0;i<bit.size();i++)
{
ret.append((char)(bit.get(i).byteValue()));
}
return ret;
}
これを逆に辿れば、polylineデータから経緯度へのデコードができるので、道路に沿ったルート表示が可能になるはずだが、はてさて思惑通りに行くか?
続く
bit.add(i+1, (byte) '\\');
i++;
}
}
for(int i=0;i<bit.size();i++)
{
ret.append((char)(bit.get(i).byteValue()));
}
return ret;
}
これを逆に辿れば、polylineデータから経緯度へのデコードができるので、道路に沿ったルート表示が可能になるはずだが、はてさて思惑通りに行くか?
続く
コメント
コメントを投稿