mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-10-27 14:37:29 +08:00
LOC: fix float altitude value ingestion, gate size and precision values (#3130)
Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
This commit is contained in:
parent
0f08087978
commit
d6d50fc862
8 changed files with 339 additions and 62 deletions
14
commands/types/dnscontrol.d.ts
vendored
14
commands/types/dnscontrol.d.ts
vendored
|
|
@ -1559,7 +1559,7 @@ declare function INCLUDE(domain: string): DomainModifier;
|
|||
declare function IP(ip: string): number;
|
||||
|
||||
/**
|
||||
* The parameter number types are as follows:
|
||||
* The parameter number types ingested are as follows:
|
||||
*
|
||||
* ```
|
||||
* name: string
|
||||
|
|
@ -1570,7 +1570,7 @@ declare function IP(ip: string): number;
|
|||
* deg2: uint32
|
||||
* min2: uint32
|
||||
* sec2: float32
|
||||
* altitude: uint32
|
||||
* altitude: float32
|
||||
* size: float32
|
||||
* horizontal_precision: float32
|
||||
* vertical_precision: float32
|
||||
|
|
@ -1627,15 +1627,21 @@ declare function IP(ip: string): number;
|
|||
*
|
||||
* `degrees,minutes,seconds,[NnSs],deg,min,sec,[EeWw],altitude,size,horizontal_precision,vertical_precision`
|
||||
*
|
||||
* where:
|
||||
* altitude: [-100000.00 .. 42849672.95] BY .01 (altitude in meters)
|
||||
* size, horizontal_precision, vertical_precision: [0 .. 90000000.00] (size/precision in meters)
|
||||
*
|
||||
* values outside of the above ranges are gated to within the ranges.
|
||||
*
|
||||
* ## Examples ##
|
||||
*
|
||||
* ```javascript
|
||||
* D("example.com", REG_MY_PROVIDER, DnsProvider(DSP_MY_PROVIDER),
|
||||
* // LOC "subdomain", d1, m1, s1, "[NnSs]", d2, m2, s2, "[EeWw]", alt, siz, hp, vp)
|
||||
* //42 21 54 N 71 06 18 W -24m 30m
|
||||
* LOC("@", 42, 21, 54, "N", 71, 6, 18, "W", -24, 30, 0, 0),
|
||||
* LOC("@", 42, 21, 54, "N", 71, 6, 18, "W", -24.01, 30, 0, 0),
|
||||
* //42 21 43.952 N 71 5 6.344 W -24m 1m 200m 10m
|
||||
* LOC("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24, 1, 200, 10),
|
||||
* LOC("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24.33, 1, 200, 10),
|
||||
* //52 14 05 N 00 08 50 E 10m
|
||||
* LOC("b", 52, 14, 5, "N", 0, 8, 50, "E", 10, 0, 0, 0),
|
||||
* //32 7 19 S 116 2 25 E 10m
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ parameter_types:
|
|||
vertical_precision: number
|
||||
---
|
||||
|
||||
The parameter number types are as follows:
|
||||
The parameter number types ingested are as follows:
|
||||
|
||||
```
|
||||
name: string
|
||||
|
|
@ -37,7 +37,7 @@ sec1: float32
|
|||
deg2: uint32
|
||||
min2: uint32
|
||||
sec2: float32
|
||||
altitude: uint32
|
||||
altitude: float32
|
||||
size: float32
|
||||
horizontal_precision: float32
|
||||
vertical_precision: float32
|
||||
|
|
@ -97,6 +97,11 @@ The coordinate format for `LOC()` is:
|
|||
|
||||
`degrees,minutes,seconds,[NnSs],deg,min,sec,[EeWw],altitude,size,horizontal_precision,vertical_precision`
|
||||
|
||||
where:
|
||||
altitude: [-100000.00 .. 42849672.95] BY .01 (altitude in meters)
|
||||
size, horizontal_precision, vertical_precision: [0 .. 90000000.00] (size/precision in meters)
|
||||
|
||||
values outside of the above ranges are gated to within the ranges.
|
||||
|
||||
## Examples ##
|
||||
|
||||
|
|
@ -105,9 +110,9 @@ The coordinate format for `LOC()` is:
|
|||
D("example.com", REG_MY_PROVIDER, DnsProvider(DSP_MY_PROVIDER),
|
||||
// LOC "subdomain", d1, m1, s1, "[NnSs]", d2, m2, s2, "[EeWw]", alt, siz, hp, vp)
|
||||
//42 21 54 N 71 06 18 W -24m 30m
|
||||
LOC("@", 42, 21, 54, "N", 71, 6, 18, "W", -24, 30, 0, 0),
|
||||
LOC("@", 42, 21, 54, "N", 71, 6, 18, "W", -24.01, 30, 0, 0),
|
||||
//42 21 43.952 N 71 5 6.344 W -24m 1m 200m 10m
|
||||
LOC("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24, 1, 200, 10),
|
||||
LOC("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24.33, 1, 200, 10),
|
||||
//52 14 05 N 00 08 50 E 10m
|
||||
LOC("b", 52, 14, 5, "N", 0, 8, 50, "E", 10, 0, 0, 0),
|
||||
//32 7 19 S 116 2 25 E 10m
|
||||
|
|
|
|||
|
|
@ -581,7 +581,7 @@ func ignore(labelSpec string, typeSpec string, targetSpec string) *models.Record
|
|||
}
|
||||
|
||||
func loc(name string, d1 uint8, m1 uint8, s1 float32, ns string,
|
||||
d2 uint8, m2 uint8, s2 float32, ew string, al int32, sz float32, hp float32, vp float32) *models.RecordConfig {
|
||||
d2 uint8, m2 uint8, s2 float32, ew string, al float32, sz float32, hp float32, vp float32) *models.RecordConfig {
|
||||
r := makeRec(name, "", "LOC")
|
||||
r.SetLOCParams(d1, m1, s1, ns, d2, m2, s2, ew, al, sz, hp, vp)
|
||||
return r
|
||||
|
|
@ -1483,16 +1483,16 @@ func makeTests() []*TestGroup {
|
|||
testgroup("LOC",
|
||||
requires(providers.CanUseLOC),
|
||||
//42 21 54 N 71 06 18 W -24m 30m
|
||||
tc("Single LOC record", loc("@", 42, 21, 54, "N", 71, 6, 18, "W", -24, 30, 0, 0)),
|
||||
tc("Single LOC record", loc("@", 42, 21, 54, "N", 71, 6, 18, "W", -24.05, 30, 0, 0)),
|
||||
//42 21 54 N 71 06 18 W -24m 30m
|
||||
tc("Update single LOC record", loc("@", 42, 21, 54, "N", 71, 6, 18, "W", -24, 30, 10, 0)),
|
||||
tc("Update single LOC record", loc("@", 42, 21, 54, "N", 71, 6, 18, "W", -24.06, 30, 10, 0)),
|
||||
tc("Multiple LOC records-create a-d modify apex", //create a-d, modify @
|
||||
//42 21 54 N 71 06 18 W -24m 30m
|
||||
loc("@", 42, 21, 54, "N", 71, 6, 18, "W", -24, 30, 0, 0),
|
||||
//42 21 43.952 N 71 5 6.344 W -24m 1m 200m
|
||||
loc("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24, 1, 200, 10),
|
||||
loc("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24.33, 1, 200, 10),
|
||||
//52 14 05 N 00 08 50 E 10m
|
||||
loc("b", 52, 14, 5, "N", 0, 8, 50, "E", 10, 0, 0, 0),
|
||||
loc("b", 52, 14, 5, "N", 0, 8, 50, "E", 10.22, 0, 0, 0),
|
||||
//32 7 19 S 116 2 25 E 10m
|
||||
loc("c", 32, 7, 19, "S", 116, 2, 25, "E", 10, 0, 0, 0),
|
||||
//42 21 28.764 N 71 00 51.617 W -44m 2000m
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package models
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"math"
|
||||
"strings"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
|
|
@ -31,7 +31,7 @@ func (rc *RecordConfig) SetTargetLOC(ver uint8, lat uint32, lon uint32, alt uint
|
|||
// for further processing to the LOC native 7 input binary format:
|
||||
// LocVersion (0), LocLatitude, LocLongitude, LocAltitude, LocSize, LocVertPre, LocHorizPre
|
||||
func (rc *RecordConfig) SetLOCParams(d1 uint8, m1 uint8, s1 float32, ns string,
|
||||
d2 uint8, m2 uint8, s2 float32, ew string, al int32, sz float32, hp float32, vp float32) error {
|
||||
d2 uint8, m2 uint8, s2 float32, ew string, al float32, sz float32, hp float32, vp float32) error {
|
||||
|
||||
err := rc.calculateLOCFields(d1, m1, s1, ns, d2, m2, s2, ew, al, sz, hp, vp)
|
||||
|
||||
|
|
@ -78,18 +78,17 @@ func (rc *RecordConfig) SetTargetLOCString(origin string, contents string) error
|
|||
// the 12 variable inputs of integers and strings.
|
||||
func (rc *RecordConfig) extractLOCFieldsFromStringInput(input string) error {
|
||||
var d1, m1, d2, m2 uint8
|
||||
var al int32
|
||||
var al float32
|
||||
var s1, s2 float32
|
||||
var ns, ew string
|
||||
var sz, hp, vp float32
|
||||
|
||||
var err error
|
||||
_, err = fmt.Sscanf(input+"~", "%d %d %f %s %d %d %f %s %dm %fm %fm %fm~",
|
||||
_, err := fmt.Sscanf(input+"~", "%d %d %f %s %d %d %f %s %fm %fm %fm %fm~",
|
||||
&d1, &m1, &s1, &ns, &d2, &m2, &s2, &ew, &al, &sz, &hp, &vp)
|
||||
if err != nil {
|
||||
return fmt.Errorf("extractLOCFieldsFromStringInput: can't unpack LOC tex input data: %w", err)
|
||||
return fmt.Errorf("extractLOCFieldsFromStringInput: can't unpack LOC text input data: %w", err)
|
||||
}
|
||||
// fmt.Printf("\ngot: %d %d %g %s %d %d %g %s %dm %0.2fm %0.2fm %0.2fm \n", d1, m1, s1, ns, d2, m2, s2, ew, al, sz, hp, vp)
|
||||
// fmt.Printf("\ngot: %d %d %g %s %d %d %g %s %0.2fm %0.2fm %0.2fm %0.2fm \n", d1, m1, s1, ns, d2, m2, s2, ew, al, sz, hp, vp)
|
||||
|
||||
rc.calculateLOCFields(d1, m1, s1, ns, d2, m2, s2, ew, al, sz, hp, vp)
|
||||
|
||||
|
|
@ -98,7 +97,7 @@ func (rc *RecordConfig) extractLOCFieldsFromStringInput(input string) error {
|
|||
|
||||
// calculateLOCFields converts from 12 user inputs to the LOC 7 binary fields
|
||||
func (rc *RecordConfig) calculateLOCFields(d1 uint8, m1 uint8, s1 float32, ns string,
|
||||
d2 uint8, m2 uint8, s2 float32, ew string, al int32, sz float32, hp float32, vp float32) error {
|
||||
d2 uint8, m2 uint8, s2 float32, ew string, al float32, sz float32, hp float32, vp float32) error {
|
||||
// Crazy hairy shit happens here.
|
||||
// We already got the useful "string" version earlier. ¯\_(ツ)_/¯ code golf...
|
||||
const LOCEquator uint64 = 0x80000000 // 1 << 31 // RFC 1876, Section 2.
|
||||
|
|
@ -120,7 +119,10 @@ func (rc *RecordConfig) calculateLOCFields(d1 uint8, m1 uint8, s1 float32, ns st
|
|||
rc.LocLongitude = uint32(LOCPrimeMeridian - lon)
|
||||
}
|
||||
// Altitude
|
||||
rc.LocAltitude = uint32(al+LOCAltitudeBase) * 100
|
||||
altitude := (float64(al) + float64(LOCAltitudeBase)) * 100
|
||||
clampedAltitude := math.Min(math.Max(0, altitude), float64(math.MaxUint32))
|
||||
rc.LocAltitude = uint32(clampedAltitude)
|
||||
|
||||
var err error
|
||||
// Size
|
||||
rc.LocSize, err = getENotationInt(sz)
|
||||
|
|
@ -167,21 +169,40 @@ func getENotationInt(x float32) (uint8, error) {
|
|||
1cm = 1e0 == 16 (1^4 + 0) or 0<<4 + 0
|
||||
0cm = 0e0 == 0
|
||||
*/
|
||||
// get int from cm value:
|
||||
num := strconv.Itoa(int(x * 100))
|
||||
// fmt.Printf("num: %s\n", num)
|
||||
// split string on zeroes to count zeroes:
|
||||
arr := strings.Split(num, "0")
|
||||
// fmt.Printf("arr: %s\n", arr)
|
||||
// get the leading digit:
|
||||
prefix, err := strconv.Atoi(arr[0])
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("can't unpack LOC base/mantissa: %w", err)
|
||||
if x == 0 {
|
||||
return 0, nil // both mantissa and exponent will be zero
|
||||
}
|
||||
// fmt.Printf("prefix: %d\n", prefix)
|
||||
// fmt.Printf("lenArr-1: %d\n", len(arr)-1)
|
||||
// construct our x^e uint8
|
||||
value := uint8((prefix << 4) | (len(arr) - 1))
|
||||
// fmt.Printf("m_e: %d\n", value)
|
||||
return value, err
|
||||
|
||||
// get cm value
|
||||
num := float64(x) * 100
|
||||
|
||||
// Get exponent (base 10)
|
||||
exp := int(math.Floor(math.Log10(num)))
|
||||
|
||||
// Normalize the mantissa
|
||||
mantissa := num / math.Pow(10, float64(exp))
|
||||
|
||||
// Adjust mantissa and exponent to fit into 4-bit ranges (0-15)
|
||||
for mantissa < 1 && exp > 0 {
|
||||
mantissa *= 10
|
||||
exp--
|
||||
}
|
||||
|
||||
// Truncate the mantissa (integer value) and ensure it's within 4 bits
|
||||
mantissaInt := int(math.Floor(mantissa))
|
||||
if mantissaInt > 9 {
|
||||
mantissaInt = 9 // Cap mantissa at 9
|
||||
}
|
||||
|
||||
// Ensure exponent is within 4 bits
|
||||
if exp < 0 {
|
||||
exp = 0 // Cap negative exponents at 0
|
||||
} else if exp > 9 {
|
||||
exp = 9 // Cap exponent at 9
|
||||
}
|
||||
|
||||
// Pack mantissa and exponent into a single uint8
|
||||
packedValue := uint8((mantissaInt << 4) | (exp & 0x0F))
|
||||
|
||||
return packedValue, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -683,10 +683,33 @@ function getENotationInt(x) {
|
|||
0cm = 0e0 == 0
|
||||
*/
|
||||
size = x * 100; // get cm value
|
||||
// get the m^e version of size
|
||||
array = size.toExponential(0).split('e+').map(Number);
|
||||
|
||||
// Convert the number to scientific notation
|
||||
var exp = Math.floor(Math.log10(size)); // Get the exponent (base 10)
|
||||
var mantissa = size / Math.pow(10, exp); // Normalize mantissa
|
||||
|
||||
// Normalize the mantissa to fit into 4 bits (between 0 and 15)
|
||||
while (mantissa < 1 && exp > 0) {
|
||||
mantissa *= 10;
|
||||
exp -= 1;
|
||||
}
|
||||
|
||||
/* Four-bit values greater than 9 are undefined, as are values with a base
|
||||
of zero and a non-zero exponent.
|
||||
*/
|
||||
|
||||
// Ensure mantissa and exponent are within 4-bit range (0-15) but no greater than 9
|
||||
mantissa = Math.floor(mantissa); // We truncate decimals
|
||||
if (mantissa > 9) {
|
||||
mantissa = 9; // Cap mantissa at 9
|
||||
}
|
||||
if (exp < 0) {
|
||||
exp = 0; // We cap negative exponents at 0
|
||||
} else if (exp > 9) {
|
||||
exp = 9; // Cap exponent at 9
|
||||
}
|
||||
// convert it to 4bit:4bit uint8
|
||||
m_e = (array[0] << 4) | array[1];
|
||||
m_e = (mantissa << 4) | (exp & 0xf);
|
||||
return m_e;
|
||||
}
|
||||
|
||||
|
|
@ -735,10 +758,30 @@ function locStringBuilder(record, args) {
|
|||
}
|
||||
|
||||
// handle altitude, size, horizontal precision, vertical precision
|
||||
precisionbuffer = args.alt.toString() + 'm';
|
||||
precisionbuffer += ' ' + args.siz.toString() + 'm';
|
||||
precisionbuffer += ' ' + args.hp.toString() + 'm';
|
||||
precisionbuffer += ' ' + args.vp.toString() + 'm';
|
||||
// alt -100000.00 .. 42849672.95m
|
||||
// size, horizontal precision, vertical precision 0 .. 90000000.00m
|
||||
precisionbuffer =
|
||||
(args.alt < -100000
|
||||
? -100000
|
||||
: args.alt > 42849672.95
|
||||
? 42849672.95
|
||||
: args.alt.toString()) + 'm';
|
||||
precisionbuffer +=
|
||||
' ' +
|
||||
(args.siz > 90000000
|
||||
? 90000000
|
||||
: args.siz < 0
|
||||
? 0
|
||||
: args.siz.toString()) +
|
||||
'm';
|
||||
precisionbuffer +=
|
||||
' ' +
|
||||
(args.hp > 90000000 ? 90000000 : args.hp < 0 ? 0 : args.hp.toString()) +
|
||||
'm';
|
||||
precisionbuffer +=
|
||||
' ' +
|
||||
(args.vp > 90000000 ? 90000000 : args.vp < 0 ? 0 : args.vp.toString()) +
|
||||
'm';
|
||||
|
||||
record.target = nsstring + ewstring + precisionbuffer;
|
||||
|
||||
|
|
@ -763,23 +806,23 @@ function locDMSBuilder(record, args) {
|
|||
// W
|
||||
else record.loclongitude = LOCPrimeMeridian - lon;
|
||||
// Altitude
|
||||
record.localtitude = (args.alt + LOCAltitudeBase) * 100;
|
||||
record.localtitude = parseInt((args.alt + LOCAltitudeBase) * 100);
|
||||
// 'cast' altitude to fit 'uint32'
|
||||
record.localtitude =
|
||||
record.localtitude > 4294967295
|
||||
? 4294967295
|
||||
: record.localtitude < 0
|
||||
? 0
|
||||
: record.localtitude;
|
||||
// Size
|
||||
record.locsize = getENotationInt(args.siz);
|
||||
// Horizontal Precision
|
||||
m_e = args.hp;
|
||||
record.lochorizpre = getENotationInt(args.hp);
|
||||
// if (m_e != 0) {
|
||||
// } else {
|
||||
// record.lochorizpre = 22; // 10,000m default
|
||||
// }
|
||||
|
||||
// Vertical Precision
|
||||
m_e = args.vp;
|
||||
record.locvertpre = getENotationInt(args.vp);
|
||||
// if (m_e != 0) {
|
||||
// } else {
|
||||
// record.lochorizpre = 19; // 10m default
|
||||
// }
|
||||
}
|
||||
|
||||
// LOC(name,d1,m1,s1,ns,d2,m2,s2,ew,alt,siz,hp,vp, recordModifiers...)
|
||||
|
|
@ -800,11 +843,69 @@ var LOC = recordBuilder('LOC', {
|
|||
['vp', _.isNumber], // vertical precision
|
||||
],
|
||||
transform: function (record, args, modifiers) {
|
||||
validateIntegers(args);
|
||||
|
||||
record = locStringBuilder(record, args);
|
||||
record = locDMSBuilder(record, args);
|
||||
},
|
||||
});
|
||||
|
||||
// Post-validation function for LOC that checks if degrees and minutes are integers
|
||||
function validateIntegers(args) {
|
||||
if (args.d1 % 1 !== 0) {
|
||||
throw (
|
||||
"Degrees N/S shall be an integer: record '" +
|
||||
args.name +
|
||||
"': *" +
|
||||
args.d1 +
|
||||
'*, ' +
|
||||
args.m1 +
|
||||
', ' +
|
||||
args.s1 +
|
||||
', ...'
|
||||
);
|
||||
}
|
||||
if (args.m1 % 1 !== 0) {
|
||||
throw (
|
||||
"Minutes N/S shall be an integer: record '" +
|
||||
args.name +
|
||||
"': " +
|
||||
args.d1 +
|
||||
', *' +
|
||||
args.m1 +
|
||||
'*, ' +
|
||||
args.s1 +
|
||||
', ...'
|
||||
);
|
||||
}
|
||||
if (args.d2 % 1 !== 0) {
|
||||
throw (
|
||||
"Degrees E/W shall be an integer: record '" +
|
||||
args.name +
|
||||
"': *" +
|
||||
args.d2 +
|
||||
'*, ' +
|
||||
args.m2 +
|
||||
', ' +
|
||||
args.s2 +
|
||||
', ...'
|
||||
);
|
||||
}
|
||||
if (args.m2 % 1 !== 0) {
|
||||
throw (
|
||||
"Minutes E/W shall be an integer: record '" +
|
||||
args.name +
|
||||
"': " +
|
||||
args.d2 +
|
||||
', *' +
|
||||
args.m2 +
|
||||
'*, ' +
|
||||
args.s2 +
|
||||
', ...'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function ConvertDDToDMS(D, longitude) {
|
||||
//stackoverflow, baby. do not re-order the rows.
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,23 @@
|
|||
D("foo.com","none"
|
||||
// LOC "subdomain", d1, m1, s1, "[NnSs]", d2, m2, s2, "[EeWw]", alt, siz, hp, vp)
|
||||
, LOC("@", 42, 21, 54, "N", 71, 6, 18, "W", -24, 30, 0, 0) //42 21 54 N 71 06 18 W -24m 30m
|
||||
, LOC("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24, 1, 200, 10) //42 21 43.952 N 71 5 6.344 W -24m 1m 200m
|
||||
, LOC("b", 52, 14, 5, "N", 0, 8, 50, "E", 10, 0, 0, 0) //52 14 05 N 00 08 50 E 10m
|
||||
, LOC("a", 42, 21, 43.952, "N", 71, 5, 6.344, "W", -24.01, 1, 200, 10) //42 21 43.952 N 71 5 6.344 W -24.01m 1m 200m
|
||||
, LOC("b", 52, 14, 5, "N", 0, 8, 50, "E", 10.33, 0, 0, 0) //52 14 05 N 00 08 50 E 10.33m
|
||||
, LOC("c", 32, 7, 19, "S",116, 2, 25, "E", 10, 0, 0, 0) //32 7 19 S 116 2 25 E 10m
|
||||
, LOC("d", 42, 21, 28.764, "N", 71, 0, 51.617, "W", -44, 2000, 0, 0) //42 21 28.764 N 71 00 51.617 W -44m 2000m
|
||||
, LOC("d-alt-highest", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 42849672.95, 2000, 0, 0) //42 21 28.764 N 71 00 51.617 W 42849672.95m 2000m
|
||||
, LOC("d-alt-lowest", 42, 21, 28.764, "N", 71, 0, 51.617, "W", -100000.00, 2000, 0, 0) //42 21 28.764 N 71 00 51.617 W -100000.00m 2000m
|
||||
, LOC("d-alt-toohigh", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 42849672.96, 2000, 0, 0) //42 21 28.764 N 71 00 51.617 W 42849672.95m 2000m
|
||||
, LOC("d-alt-toolow", 42, 21, 28.764, "N", 71, 0, 51.617, "W", -100000.01, 2000, 0, 0) //42 21 28.764 N 71 00 51.617 W -100000m 2000m
|
||||
, LOC("d-horizprecision-hi", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 1, 90000000, 0) //42 21 28.764 N 71 00 51.617 W 0m 1m 90000000m 0.00m
|
||||
, LOC("d-horizprecision-toohi", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 1, 98765432, 0) //42 21 28.764 N 71 00 51.617 W 0m 1m 90000000m 0.00m
|
||||
, LOC("d-horizprecision-toolow", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 1, -1, 0) //42 21 28.764 N 71 00 51.617 W 0m 1m 0m 0.00m
|
||||
, LOC("d-size-toohi", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 98765432, 0, 0) //42 21 28.764 N 71 00 51.617 W -44m 2000m
|
||||
, LOC("d-size-toolow", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, -1, 0, 0) //42 21 28.764 N 71 00 51.617 W -44m 0m
|
||||
, LOC("d-size-hi", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 90000000, 0, 0) //42 21 28.764 N 71 00 51.617 W -44m 90000000m
|
||||
, LOC("d-vertprecision-hi", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 1, 0, 90000000) //42 21 28.764 N 71 00 51.617 W 0m 1m 0.00m 90000000m
|
||||
, LOC("d-vertprecision-toohi", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 1, 0, 98765432) //42 21 28.764 N 71 00 51.617 W 0m 1m 0.00m 90000000m
|
||||
, LOC("d-vertprecision-toolow", 42, 21, 28.764, "N", 71, 0, 51.617, "W", 0, 1, 0, -1) //42 21 28.764 N 71 00 51.617 W 0m 1m 0.00m 0m
|
||||
|
||||
// via the Decimal degrees to LOC builder.
|
||||
, LOC_BUILDER_DD({
|
||||
|
|
|
|||
|
|
@ -25,16 +25,16 @@
|
|||
"locvertpre": 19,
|
||||
"loclatitude": 2299987600,
|
||||
"loclongitude": 1891577304,
|
||||
"localtitude": 9997600,
|
||||
"target": "42 21 43.952 N 71 5 6.344 W -24m 1m 200m 10m"
|
||||
"localtitude": 9997599,
|
||||
"target": "42 21 43.952 N 71 5 6.344 W -24.01m 1m 200m 10m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "b",
|
||||
"loclatitude": 2335528648,
|
||||
"loclongitude": 2148013648,
|
||||
"localtitude": 10001000,
|
||||
"target": "52 14 5 N 0 8 50 E 10m 0m 0m 0m"
|
||||
"localtitude": 10001033,
|
||||
"target": "52 14 5 N 0 8 50 E 10.33m 0m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
|
|
@ -53,6 +53,124 @@
|
|||
"localtitude": 9995600,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W -44m 2000m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-alt-highest",
|
||||
"locsize": 37,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 4294967295,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 42849672.95m 2000m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-alt-lowest",
|
||||
"locsize": 37,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W -100000m 2000m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-alt-toohigh",
|
||||
"locsize": 37,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 4294967295,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 42849672.95m 2000m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-alt-toolow",
|
||||
"locsize": 37,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W -100000m 2000m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-horizprecision-hi",
|
||||
"locsize": 18,
|
||||
"lochorizpre": 153,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 1m 90000000m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-horizprecision-toohi",
|
||||
"locsize": 18,
|
||||
"lochorizpre": 153,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 1m 90000000m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-horizprecision-toolow",
|
||||
"locsize": 18,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 1m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-size-toohi",
|
||||
"locsize": 153,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 90000000m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-size-toolow",
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 0m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-size-hi",
|
||||
"locsize": 153,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 90000000m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-vertprecision-hi",
|
||||
"locsize": 18,
|
||||
"locvertpre": 153,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 1m 0m 90000000m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-vertprecision-toohi",
|
||||
"locsize": 18,
|
||||
"locvertpre": 153,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 1m 0m 90000000m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "d-vertprecision-toolow",
|
||||
"locsize": 18,
|
||||
"loclatitude": 2299972412,
|
||||
"loclongitude": 1891832031,
|
||||
"localtitude": 10000000,
|
||||
"target": "42 21 28.764 N 71 0 51.617 W 0m 1m 0m 0m"
|
||||
},
|
||||
{
|
||||
"type": "LOC",
|
||||
"name": "big-ben",
|
||||
|
|
|
|||
|
|
@ -1,10 +1,23 @@
|
|||
$TTL 300
|
||||
@ IN LOC 42 21 54.000 N 71 06 18.000 W -24m 30m 0.00m 0.00m
|
||||
a IN LOC 42 21 43.952 N 71 05 6.344 W -24m 1m 200m 10m
|
||||
b IN LOC 52 14 5.000 N 00 08 50.000 E 10m 0.00m 0.00m 0.00m
|
||||
a IN LOC 42 21 43.952 N 71 05 6.344 W -24.01m 1m 200m 10m
|
||||
b IN LOC 52 14 5.000 N 00 08 50.000 E 10.33m 0.00m 0.00m 0.00m
|
||||
big-ben IN LOC 51 30 3.033 N 00 07 28.651 W 6m 0.00m 0.00m 0.00m
|
||||
c IN LOC 32 07 19.000 S 116 02 25.000 E 10m 0.00m 0.00m 0.00m
|
||||
d IN LOC 42 21 28.764 N 71 00 51.617 W -44m 2000m 0.00m 0.00m
|
||||
d-alt-highest IN LOC 42 21 28.764 N 71 00 51.617 W 42849672.95m 2000m 0.00m 0.00m
|
||||
d-alt-lowest IN LOC 42 21 28.764 N 71 00 51.617 W -100000m 2000m 0.00m 0.00m
|
||||
d-alt-toohigh IN LOC 42 21 28.764 N 71 00 51.617 W 42849672.95m 2000m 0.00m 0.00m
|
||||
d-alt-toolow IN LOC 42 21 28.764 N 71 00 51.617 W -100000m 2000m 0.00m 0.00m
|
||||
d-horizprecision-hi IN LOC 42 21 28.764 N 71 00 51.617 W 0m 1m 90000000m 0.00m
|
||||
d-horizprecision-toohi IN LOC 42 21 28.764 N 71 00 51.617 W 0m 1m 90000000m 0.00m
|
||||
d-horizprecision-toolow IN LOC 42 21 28.764 N 71 00 51.617 W 0m 1m 0.00m 0.00m
|
||||
d-size-hi IN LOC 42 21 28.764 N 71 00 51.617 W 0m 90000000m 0.00m 0.00m
|
||||
d-size-toohi IN LOC 42 21 28.764 N 71 00 51.617 W 0m 90000000m 0.00m 0.00m
|
||||
d-size-toolow IN LOC 42 21 28.764 N 71 00 51.617 W 0m 0.00m 0.00m 0.00m
|
||||
d-vertprecision-hi IN LOC 42 21 28.764 N 71 00 51.617 W 0m 1m 0.00m 90000000m
|
||||
d-vertprecision-toohi IN LOC 42 21 28.764 N 71 00 51.617 W 0m 1m 0.00m 90000000m
|
||||
d-vertprecision-toolow IN LOC 42 21 28.764 N 71 00 51.617 W 0m 1m 0.00m 0.00m
|
||||
fraser-island IN LOC 25 14 24.000 S 153 09 0.000 E 3m 0.00m 0.00m 0.00m
|
||||
guinness-brewery IN LOC 53 20 40.000 N 06 17 20.000 W 300m 0.00m 0.00m 0.00m
|
||||
hawaii IN LOC 21 30 0.000 N 158 00 0.000 W 920m 0.00m 0.00m 0.00m
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue