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:
Paul Donald 2024-09-27 18:06:19 +02:00 committed by GitHub
parent 0f08087978
commit d6d50fc862
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 339 additions and 62 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
}

View file

@ -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 {

View file

@ -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({

View file

@ -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",

View file

@ -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