decode解码 geohash_ABAP实现Geohash

classzcl_geohash implementation. method bin_to_dec. if contains( val= i_bin regex = `[^01]` ). return. endif. data(length)=strlen( i_bin ). data(l_index)= 0. do length times. data(temp)= i_bin+l_index(1). if temp= 1. r_dec= r_dec + 2 ** ( length - l_index - 1). endif. l_index= l_index + 1. enddo. endmethod. method class_constructor. mt_base32_code1=value #( ( decimals= 0 base32 = '0') ( decimals= 1 base32 = '1') ( decimals= 2 base32 = '2') ( decimals= 3 base32 = '3') ( decimals= 4 base32 = '4') ( decimals= 5 base32 = '5') ( decimals= 6 base32 = '6') ( decimals= 7 base32 = '7') ( decimals= 8 base32 = '8') ( decimals= 9 base32 = '9') ( decimals= 10 base32 = 'b') ( decimals= 11 base32 = 'c') ( decimals= 12 base32 = 'd') ( decimals= 13 base32 = 'e') ( decimals= 14 base32 = 'f') ( decimals= 15 base32 = 'g') ( decimals= 16 base32 = 'h') ( decimals= 17 base32 = 'j') ( decimals= 18 base32 = 'k') ( decimals= 19 base32 = 'm') ( decimals= 20 base32 = 'n') ( decimals= 21 base32 = 'p') ( decimals= 22 base32 = 'q') ( decimals= 23 base32 = 'r') ( decimals= 24 base32 = 's') ( decimals= 25 base32 = 't') ( decimals= 26 base32 = 'u') ( decimals= 27 base32 = 'v') ( decimals= 28 base32 = 'w') ( decimals= 29 base32 = 'x') ( decimals= 30 base32 = 'y') ( decimals= 31 base32 = 'z') ). mt_base32_code2=mt_base32_code1. mt_neighbors_odd=value #( ( f1= 'b' f2 = 'c' f3 = 'f' f4 = 'g' f5 = 'u' f6 = 'v' f7 = 'y' f8 = 'z') ( f1= '8' f2 = '9' f3 = 'd' f4 = 'e' f5 = 's' f6 = 't' f7 = 'w' f8 = 'x') ( f1= '2' f2 = '3' f3 = '6' f4 = '7' f5 = 'k' f6 = 'm' f7 = 'q' f8 = 'r') ( f1= '0' f2 = '1' f3 = '4' f4 = '5' f5 = 'h' f6 = 'j' f7 = 'n' f8 = 'p') ). mt_neighbors_even=value #( ( f1= 'p' f2 = 'r' f3 = 'x' f4 = 'z') ( f1= 'n' f2 = 'q' f3 = 'w' f4 = 'y') ( f1= 'j' f2 = 'm' f3 = 't' f4 = 'v') ( f1= 'h' f2 = 'k' f3 = 's' f4 = 'u') ( f1= '5' f2 = '7' f3 = 'e' f4 = 'g') ( f1= '4' f2 = '6' f3 = 'd' f4 = 'f') ( f1= '1' f2 = '3' f3 = '9' f4 = 'c') ( f1= '0' f2 = '2' f3 = '8' f4 = 'b') ). endmethod. method decode. types: numc5 type n length5. data(length)=strlen( geohash ). if length<= 0. return. endif. if length>c_max_hash_length. length=c_max_hash_length. endif. data(geo_hash_internal)=to_lower( geohash ). data(hash_index)= 0. do length times. data(base32)= geo_hash_internal+hash_index(1). data(decimals)= value #( mt_base32_code2[ base32 = base32 ]-decimals optional ). data(bin5)=conv numc5( dec_to_bin( decimals ) ). data: mix_bin typestring, longitude_bin typestring, latitude_bin typestring. mix_bin= mix_bin &&bin5. hash_index= hash_index + 1. enddo. data(bin_index)= 0. do strlen( mix_bin ) times. data(bin)= mix_bin+bin_index(1). if bin_indexmod 2 = 0. longitude_bin= longitude_bin &&bin. else. latitude_bin= latitude_bin &&bin. endif. bin_index= bin_index + 1. enddo. data(longitude_left)=c_longitude_min. data(longitude_right)=c_longitude_max. data(latitude_left)=c_latitude_min. data(latitude_right)=c_latitude_max. data(longitude_index)= 0. do strlen( longitude_bin ) times. data(bin_longitude)= longitude_bin+longitude_index(1). get_tude( exporting i_left=longitude_left i_right=longitude_right i_bin=bin_longitude importing e_left=longitude_left e_right=longitude_right e_tude=longitude ). longitude_index= longitude_index + 1. enddo. data(latitude_index)= 0. do strlen( latitude_bin ) times. data(bin_latitude)= latitude_bin+latitude_index(1). get_tude( exporting i_left=latitude_left i_right=latitude_right i_bin=bin_latitude importing e_left=latitude_left e_right=latitude_right e_tude=latitude ). latitude_index= latitude_index + 1. enddo. endmethod. method dec_to_bin."ignore negative number data(temp) = 0. data(dec)=i_dec. while dec> 0. temp= dec mod 2. dec= dec / 2 -temp. r_bin= r_bin &&conv char1( temp ). endwhile. r_bin=reverse( r_bin ). endmethod. method encode. if length< 1. return. endif. if length>c_max_hash_length. data(hash_length)=c_max_hash_length. else. hash_length=length. endif. data(loop_times)= hash_length * 5 / 2 + 1. data: longitude_bin typestring, latitude_bin typestring, mix_bin typestring. data(longitude_left)=c_longitude_min. data(longitude_right)=c_longitude_max. data(latitude_left)=c_latitude_min. data(latitude_right)=c_latitude_max. do loop_times times. get_bin( exporting i_left=longitude_left i_right=longitude_right i_tude=longitude importing e_left=longitude_left e_right=longitude_right e_bin=data(longitude_bin_temp) ). get_bin( exporting i_left=latitude_left i_right=latitude_right i_tude=latitude importing e_left=latitude_left e_right=latitude_right e_bin=data(latitude_bin_temp) ). mix_bin= mix_bin && longitude_bin_temp &&latitude_bin_temp. enddo. data(code_index)= 0. do hash_length times. data(offset)= code_index * 5. data(bin)= mix_bin+offset(5). r_geo_hash= r_geo_hash &&value #( mt_base32_code1[ decimals= bin_to_dec( i_bin = bin ) ]-base32 optional ). code_index= code_index + 1. enddo. endmethod. method get_bin. data(mid)= conv ty_tude( ( i_left + i_right ) / 2). if i_tude<=mid. e_bin=c_zero. e_left=i_left. e_right=mid. else. e_bin=c_one. e_left=mid. e_right=i_right. endif. endmethod. method get_code_neighbor. data(table_descr)= cast cl_abap_tabledescr( cl_abap_tabledescr=>describe_by_data( i_table ) ). data(column_count)=lines( cast cl_abap_structdescr( table_descr->get_table_line_type( ) )->components ). data(col_index)= 1. loop at i_table assigning field-symbol(). data(row_index)= sy-tabix. col_index= 1. while col_index<=column_count. assign component col_index ofstructure to field-symbol(). if sy-subrc = 0. if =i_member. data(found)=abap_true.exit. endif. endif. col_index= col_index + 1. endwhile. if found=abap_true.exit. endif. endloop. if found=abap_false. return. endif. types: begin of ty_direction, row type i, col type i, end of ty_direction. data: direction_index_table type standard table of ty_direction. direction_index_table=value #( ( row= -1 col = -1) ( row= -1 col = 0) ( row= -1 col = +1) ( row= 0 col = -1) ( row= 0 col = +1) ( row= 1 col = -1) ( row= 1 col = 0) ( row= 1 col = +1) ). data(row_count)=lines( i_table ). loop at direction_index_table assigning field-symbol(). data(row_result)= get_index( index = row_index offset = -row max_index =row_count ). data(col_result)= get_index( index = col_index offset = -col max_index =column_count ). read table i_table assigningindex row_result. if sy-subrc = 0. assign component col_result ofstructure to . if sy-subrc = 0. r_table= value #( base r_table ( hash = ) ). endif. endif. endloop. endmethod. method get_index. if abs( offset )>=max_index. return. endif. r_index= index +offset. if r_index>max_index . r_index=offset. endif. if r_index<= 0. r_index= max_index +r_index. endif. endmethod. method get_tude. data(mid)= conv ty_tude( ( i_left + i_right ) / 2). if i_bin=c_zero. e_left=i_left. e_right=mid. e_tude= ( i_left + mid ) / 2. else. e_left=mid. e_right=i_right. e_tude= ( mid + i_right ) / 2. endif. endmethod. method neighbors. if geohashisinitial. return. endif. data(geohash_internal)=to_lower( geohash ). data(length)=strlen( geohash_internal ). data(offset)= length - 1. data(suffix)= geohash_internal+offset(1). if lengthmod 2 = 0. data(code_table)= get_code_neighbor( i_table = mt_neighbors_even i_member =suffix ). else. code_table= get_code_neighbor( i_table = mt_neighbors_odd i_member =suffix ). endif. data(prefix)=geohash_internal(offset). loop at code_table assigning field-symbol(). neighbors= value #( base neighbors ( hash = prefix && -hash ) ). endloop. endmethod. method validate. valid=abap_false. if geohashisinitial . return. endif. if strlen( geohash )>c_max_hash_length. return. endif. data(geohash_internal)=to_lower( geohash ). data(geohash_index)= 0. do strlen( geohash ) times. data(hash)= geohash_internal+geohash_index(1). ifnot line_exists( mt_base32_code2[ base32 =hash ] ). return. endif. geohash_index= geohash_index + 1. enddo. valid=abap_true. endmethod.endclass.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值