1.0.1 • Published 1 year ago

three-map-terrain v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

three-map-terrain

A JavaScript library to build 3D maps with three.js.

Live demo / Source code

About

three-map-terrain takes two slippy map tilesets, one to fetch elevation data tiles, the other to texture the meshes built from said elevation data (any XYZ tileserver will do).

Installation

yarn add three three-map-terrain

Basic - Quick start

import { Scene } from 'three'
import { Map, Source } from 'three-map-terrain'

const scene = new Scene()

const location = { lat: 46.57634, lon: 7.9904 }
const source = new Source({ api: 'eox' })
const map = new Map({ source, location })

scene.add(map)
map.init(() => {
  console.log('Map is ready')
})

See full example

React - Quick start

import { useEffect, useState } from 'react'
import { Canvas } from '@react-three/fiber'
import { Map, Source } from 'three-map-terrain'

export default function App() {
  const [map, setMap] = useState<Map>()

  useEffect(() => {
    setMap(
      new Map({
        source: new Source({ api: 'eox' }),
        location: { lat: 46.57634, lon: 7.9904 }
      })
    )
  }, [])

  useEffect(() => {
    if (map) {
      map.init(() => console.log('Map is ready'))
    }
  }, [map])

  return (
    <Canvas>
      {map && <primitive object={map.terrain} position={[0, 0, 0]} />}
    </Canvas>
  )
}

See full example

Documentation

Source class

Defines a tileset source used to fetch textures applied to the 3D terrain mesh.

const source = new Source({ api, token })
ArgumentDescriptionRequiredDefault Value
apiOne of ['osm', 'mapbox', 'eox', 'maptiler']true-
tokenYour api keyfor mapbox or maptiler-

Map class

The main class three-map-terrain. Creates a 3D map using a grid of tiles.

const map = new Map({ source, location, options, material })
ArgumentTypeDescriptionRequiredDefault Value
sourceSourceA source instancetrue-
position{ lat: number, lon: number }An object containing the latitude and longitude values used to center the maptrue-
optionsMapOptionsAn object to pass some map options (override)falsedefaultMapOptions
materialQuadTextureMaterialOptionsAn object to pass some material options (override)falsedefaultTextureOptions

The MapOptions type

OptionTypeDescription
nTilesnumberMap.init() will display a grid of nTiles x nTiles
zoomnumberDefault zoom level
tileSizenumberTile size at the default zoom level
tileSegmentsnumberNumber of segments given to the PlaneGeometry constructor. Maximum value is 256
zScalenumberThe raw elevation data is multiplied by zScale when building a Tile mesh

The defaultMapOptions object

{
  nTiles: 3,
  zoom: 11,
  tileSize: 600,
  tileSegments: 100,
  zScale: 0.045
}

The QuadTextureMaterialOptions type

These props are passed to ShaderMaterial.

OptionTypeDescription
lightsbooleanDefines whether this material uses lighting; true to pass uniform data related to lighting to this shader
wireframebooleanRender geometry as wireframe (using GL_LINES instead of GL_TRIANGLES)
fogbooleanDefine whether the material color is affected by global fog settings; true to pass fog uniforms to the shader

The defaultTextureOptions object

{
  lights: true,
  wireframe: false,
  fog: true
}

Map helpers

Init map cache

map.init(() => { console.log('Map is ready') })
ArgumentTypeDescriptionRequiredDefault Value
callback() => voidReady callbackfalse-

Determine the location of a point by coordinates

const posInVector3 = map.getPosition(
  {
    lat: 46.57634,
    lon: 7.9904,
    alt: 3e3
  },
  { loadTile: true }
)
ArgumentTypeDescriptionRequiredDefault Value
location{ lat: number, lon: number, alt: number }Your geolocationtrue-
options{ loadTile: number }Extra options (override)false{ loadTile: true }

Parameter loadTile determines whether to load the required tile if you have specified coordinates that are outside the already loaded tiles.

Reset map cache

map.clean()

Future list

  • Asynchronous analog of the getPosition function without passing the altitude parameter
  • Advanced example
  • Base Pin component
  • Base Direction component
  • Vue example
  • React example
  • Basic example

License and attributions

The map library code is MIT licensed.