Пройдите базовый курс обучения нашим сервисам начать обучение

Описание функционала утилиты Астро кода

Скачать версию для бразуера  http://ac.l--l.info/js/ac_front.js

Скачать версию для node js  http://ac.l--l.info/js/ac.js


Объект ac - Описание работы

Методы объекта ac переводят дату формата ddmmyyyyhhmm к запакованному виду, где дата представляется числом с 12 знаками, которые переводятся в 62-ричную систему исчисления. Например дата 1 января 1900 года 12 часов дня, преобразовывается к виду 010119001200 и после запаковки выглядит как b2OisM. Т.е. из 12 знаков мы получаем на выходе 6. При разработке стоит учитывать тот факт, что время в Астро Коде хранится без поправки на Гринвич, т.е. GMT + 0. Это связано с тем, что при рождении на границе дат при переводе времени в вид GMT может меняться еще и дата. Поэтому перед формированием параметра даты для объекта ac следует, провести приведение времени к Гринвичу.

Простой код на JavaScript проиллюстрирует, как это можно сделать.

gmt = 3.0; //поправка на Гринвич в формате float.
dates = new Date();//Получить текущую дату.
dates = new Date(dates.getTime() - gmt * 60000);//Создать новый объект даты с учетом поправки на Гринвич

Долгота и широта храниться в формате gggmmss долготы, и следом gggmmss широты. Всего 14 знаков gggmmssgggmmss, причем градусы, которые меньше 10 или 100 градусов следует формировать с нулями, например 9 следует привести к виду 009, а 23 к виду 023. Для отрицательных значений градусов западной долготы и южной широты, следует перевести значения к диапазону 0-360. Делается это простым отниманием отрицательного значения от 360.

Итоговый формат

Данные которые принимает ac имеют вид ddmmyyyyhhmm-gggmmssgggmmss, где '-' является разделителем.

ac.calc(data, base)

Основной метод, который шифрует и дешифрует данные Астро Код.

data - данные в формате ddmmyyyyhhmm-gggmmssgggmmss или Астро код в формате baseN:baseN возвращает либо дешифрованный Астро код в формате ddmmyyyyhhmm-gggmmssgggmmss, либо шифрует данные, запаковывая их в base62

base - необязательный параметр

var ac = {
base: 62,
calc: function(data,base){
    var first, second;
    if((/-/g).test(data)){
        data=data.split("-");
        first =this.encode(data[0], base).toString();
    second = this.encode(data[1],base).toString();
    return first+":"+second;
    }else if((/:/g).test(data)){
        data=data.split(":");
        first =this.decode(data[0], base).toString();
    second = this.decode(data[1],base).toString();
if(second.length<14){
    var idx= 14 - second.length;
    while(idx!=0){
        second = "0"+second;
    idx--;
    }
}
if(first.length<12){
    var idx= 12 - first.length;
        while(idx!=0){
            first = "0"+first;
        idx--;
        }
    }
    return first+"-"+second;
}
return false;
},

ac.base - система исчисления, по умолчанию используется base62

base: 62,

ac.encode(number, base)

Метод для запаковки числа в указанную в base систему исчисления

number - любое число в 10-ричной системе исчисления (string)

base - необязательный параметр системы исчисления

encode: function encode(number, base){
    if(!base) base = this.base
    var min, max, buf="", char =["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
    min = number % base;
    max = number / base;
    if( max > base ) buf= buf + encode(max,base);
    var master = char[parseInt(max,10)];
    var slave = char[parseInt(min,10)];
    !(master==undefined) || (master="");
    !(slave==undefined) || (slave="");
    buf = buf + master + slave;
    return buf;
},

ac.decode(number, base)

Метод для распаковки числа в указанную в base систему исчисления

astroCode - любое число в 10-ричной системе исчисления (string)

base - необязательный параметр системы исчисления

decode: function decode(astroCode,base){
    var result=0, buf="", char =["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
    if(!base) base = this.base
    for(var i=0;i < astroCode.length;i++){
        result+=Math.pow(base,(astroCode.length-i-1))*_.indexOf(char, astroCode[i]);
    }
    return result;
},

ac.sweFormat(astroCode)

Форматирует Астро код в удобный вид

astroCode - Астро код в формате baseN:baseN (string)

Возвращает:

.lon - долгота в формате градус°минута'секунда"

.lat - широта в формате градус°минута'секунда"

.longitude - долгота в формате градус(float)

.latitude - широта в формате градус(float)

.date - Объект даты полный

.dateYear - Объект даты только год

.dateMonth - Объект даты только год и месяц

.dateMonth - Объект даты только год и месяц

.JDYear - Юлианский день на начало года

.JDMonth - Юлианский день на начало месяца

.JD - Юлианский день на дату в Астро Коде

sweFormat:function sweFormat(astroCode){
    astroCode = astroCode.split("-");
    var hour = parseInt(astroCode[0].substr(astroCode[0].length-4,2));
    var minutes = parseInt(astroCode[0].substr(astroCode[0].length-2,2));
    this.buf = {
        day:(astroCode[0].substr(0,2)),
        month:(astroCode[0].substr(2,2)),
        year:(astroCode[0].substr(4,4)),
        time:hour+":"+minutes
    }
    if(hour<10) hour="0"+parseInt(hour);
    if(minutes<10) minutes="0"+parseInt(minutes);
    if(hour==0) hour="00";
    if(minutes==0) minutes="00";
    var modalGrad = astroCode[1].substr(0,3)
    if (modalGrad>180)
        modalGrad = modalGrad-360;
    this.buf.longitude= parseInt(modalGrad)+(astroCode[1].substr(3,2)/60)+(astroCode[1].substr(5,2))/3600
    this.buf.lon = modalGrad+"°"+astroCode[1].substr(3,2)+"'"+astroCode[1].substr(5,2)+'"'
    modalGrad = astroCode[1].substr(7,3)
    if (modalGrad>180)
        modalGrad = modalGrad-360;
    this.buf.lat = modalGrad+"°"+astroCode[1].substr(10,2)+"'"+astroCode[1].substr(12,2)+'"'
    this.buf.latitude = parseInt(modalGrad)+(astroCode[1].substr(10,2))/60+astroCode[1].substr(12,2)/3600
    this.buf.date = new Date(this.buf.year+"-"+this.buf.month+"-"+this.buf.day+"T"+this.buf.time+":00.000Z");
    this.buf.dateYear = new Date(this.buf.year+"-01-01T00:00:00.000Z");
    this.buf.dateMonth = new Date(this.buf.year+"-"+this.buf.month+"-01T00:00:00.000Z");
    this.buf.JDYear = this.buf.dateYear.getTime()/86400000 + 2440587.5
    this.buf.JDMonth = this.buf.dateMonth.getTime()/86400000 + 2440587.5
    this.buf.JD = this.buf.date.getTime()/86400000 + 2440587.5
    return this.buf
    },

ac.degToGrad(deg)

Переводит градусы в угловые градусы минуты и секунды

deg - значение градуса (string)

degToGrad: function degToGrad(deg){
    deg = deg.split("°");
    min = deg[1].split("'");
    sec = min[1].split('"');
    deg = parseInt(deg[0])
    min = parseInt(min[0])
    sec = parseInt(sec[0])
    if(deg >=0)
        return deg + min/60 + sec/3600
    else
        return deg - min/60 - sec/3600
},

ac.gradToDeg(gradus)

gradToDeg: function gradToDeg(gradus){
    var deg,grad,minute,second;
    grad=Math.floor(gradus);
    minute = Math.floor((gradus - grad)*60);
    second = Math.floor (((gradus - grad)*60 - minute)*60);
    if(grad <0) grad = 360 + parseInt(grad);
    if(grad<10) grad="00"+grad;
    if(grad<100) grad="0"+grad;
    if(minute<10) minute="0"+minute;
    if(second<10) second="0"+second;
    return deg=grad+"°"+minute+"'"+second+'"';
}

Переводит угловые градусы минуты и секунды в градусы

gradus - значение углового градуса минуты и секунды (string)



Сервисная информация

Яндекс.Метрика

Rambler's Top100bigmir)net TOP 100Рейтинг@Mail.ruРейтинг@Mail.ru

При использовании материалов сайта ссылка обязательна

Kamail ® 2009 - 2017 г.
ver. 1.05.1374+