Grid9 JavaScript Implementation

The JavaScript implementation of Grid9 provides universal coordinate compression for both Node.js and browser environments. With full TypeScript support and comprehensive test coverage, it's perfect for web applications, Node.js servers, and cross-platform development.

Key Features: Works in Node.js & browsers • TypeScript definitions included • CommonJS & ES6 modules • Zero dependencies • Comprehensive test suite

Installation

NPM Package

# Install with npm
npm install grid9

# Install with yarn
yarn add grid9

# Install with pnpm
pnpm add grid9

Browser Usage

<!-- Via CDN -->
<script src="https://unpkg.com/grid9/dist/grid9.min.js"></script>

<!-- Or download and host locally -->
<script src="./grid9.min.js"></script>

From Source

git clone https://github.com/pedrof69/Grid9.git
cd Grid9/javascript
npm install
npm run build

Quick Start

Node.js (CommonJS)

const Grid9 = require('grid9');

// Encode coordinates to Grid9 code
const code = Grid9.encode(40.7128, -74.0060);
// Result: "Q7KH2BBYF"

// Decode Grid9 code to coordinates
const coords = Grid9.decode("Q7KH2BBYF");
// Result: { latitude: 40.712779, longitude: -74.005988 }

// Human-readable format
const readable = Grid9.encode(40.7128, -74.0060, true);
// Result: "Q7K-H2B-BYF"

ES6 Modules

import { encode, decode, calculateDistance } from 'grid9';

// Encode coordinates
const code = encode(40.7128, -74.0060);

// Calculate distance between two locations
const nyc = encode(40.7128, -74.0060);
const london = encode(51.5074, -0.1278);
const distance = calculateDistance(nyc, london);
// Result: 5570224 meters

TypeScript

import { UniformPrecisionCoordinateCompressor } from 'grid9';

// TypeScript types are included
const encoder = new UniformPrecisionCoordinateCompressor();

// Encode with type safety
const code: string = encoder.encode(40.7128, -74.0060);

// Decode returns typed coordinates
const coords: { latitude: number; longitude: number } = encoder.decode(code);

Browser Usage

<script>
// Grid9 is available as a global variable
const code = Grid9.encode(40.7128, -74.0060);
console.log(code); // "Q7KH2BBYF"

// Use in your web app
function shareLocation() {
    navigator.geolocation.getCurrentPosition(position => {
        const code = Grid9.encode(
            position.coords.latitude,
            position.coords.longitude,
            true // human-readable
        );
        document.getElementById('location-code').textContent = code;
    });
}
</script>

API Reference

Core Functions

Function Description Returns
encode(lat, lon, humanReadable?) Encode coordinates to Grid9 code string
decode(code) Decode Grid9 code to coordinates {latitude, longitude}
calculateDistance(code1, code2) Calculate distance in meters number
getNeighbors(code) Get adjacent Grid9 codes string[]
isValid(code) Validate Grid9 code format boolean
getPrecision(lat, lon) Get precision at coordinates {x, y, total}

Batch Operations

const CoordinateOperations = require('grid9/operations');

// Batch encode multiple coordinates
const locations = [
    { lat: 40.7128, lon: -74.0060 },  // NYC
    { lat: 51.5074, lon: -0.1278 },   // London
    { lat: 35.6762, lon: 139.6503 }   // Tokyo
];

const codes = CoordinateOperations.batchEncode(locations);
// Result: ["Q7KH2BBYF", "S50MBZX2Y", "PAYMZ39T7"]

// Find nearby locations
const nearby = CoordinateOperations.findNearby(40.7128, -74.0060, 1000);
// Returns all Grid9 codes within 1km radius

Advanced Features

React Integration

import React, { useState } from 'react';
import { encode, decode } from 'grid9';

function LocationSharing() {
    const [code, setCode] = useState('');
    
    const shareCurrentLocation = () => {
        navigator.geolocation.getCurrentPosition(position => {
            const grid9Code = encode(
                position.coords.latitude,
                position.coords.longitude,
                true
            );
            setCode(grid9Code);
        });
    };
    
    return (
        <div>
            <button onClick={shareCurrentLocation}>
                Share Location
            </button>
            {code && <p>Your location: {code}</p>}
        </div>
    );
}

Express.js API

const express = require('express');
const Grid9 = require('grid9');

const app = express();
app.use(express.json());

app.post('/api/encode', (req, res) => {
    try {
        const { latitude, longitude } = req.body;
        const code = Grid9.encode(latitude, longitude);
        res.json({ grid9: code });
    } catch (error) {
        res.status(400).json({ error: error.message });
    }
});

app.get('/api/decode/:code', (req, res) => {
    try {
        const coords = Grid9.decode(req.params.code);
        res.json(coords);
    } catch (error) {
        res.status(400).json({ error: 'Invalid Grid9 code' });
    }
});

Geolocation Utilities

// Calculate bearing between two locations
function getBearing(code1, code2) {
    const coord1 = Grid9.decode(code1);
    const coord2 = Grid9.decode(code2);
    
    const dLon = (coord2.longitude - coord1.longitude) * Math.PI / 180;
    const lat1 = coord1.latitude * Math.PI / 180;
    const lat2 = coord2.latitude * Math.PI / 180;
    
    const y = Math.sin(dLon) * Math.cos(lat2);
    const x = Math.cos(lat1) * Math.sin(lat2) -
              Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
    
    const bearing = Math.atan2(y, x) * 180 / Math.PI;
    return (bearing + 360) % 360;
}

Performance

Encoding Speed

5.2M+ operations/second

Decoding Speed

5.8M+ operations/second

Bundle Size

4.2KB minified + gzipped

Testing

# Run all tests
npm test

# Run tests in watch mode
npm run test:watch

# Generate coverage report
npm run test:coverage

# Run linting
npm run lint

Browser Compatibility

TypeScript Support

Grid9 includes comprehensive TypeScript definitions:

// Type definitions are automatically included
import { Grid9Code, Coordinates, PrecisionInfo } from 'grid9/types';

// Use typed interfaces
function processLocation(coords: Coordinates): Grid9Code {
    return encode(coords.latitude, coords.longitude);
}

// Type-safe precision information
const precision: PrecisionInfo = getPrecision(40.7128, -74.0060);
console.log(`Precision: ${precision.total}m`);

Common Use Cases

Location Sharing App

// Generate shareable location links
function createLocationLink(latitude, longitude) {
    const code = Grid9.encode(latitude, longitude, true);
    return `https://yourapp.com/location/${code}`;
}

// Parse location from URL
function parseLocationLink(url) {
    const code = url.split('/').pop();
    if (Grid9.isValid(code)) {
        return Grid9.decode(code);
    }
    throw new Error('Invalid location code');
}

Geofencing

// Check if location is within radius
function isWithinRadius(centerCode, checkCode, radiusMeters) {
    const distance = Grid9.calculateDistance(centerCode, checkCode);
    return distance <= radiusMeters;
}

// Monitor location changes
function monitorLocation(targetCode, callback) {
    navigator.geolocation.watchPosition(position => {
        const currentCode = Grid9.encode(
            position.coords.latitude,
            position.coords.longitude
        );
        const distance = Grid9.calculateDistance(targetCode, currentCode);
        callback(currentCode, distance);
    });
}

Need help? Check out the full source code and examples on GitHub or open an issue.

View on GitHub Back to Home