Giter VIP home page Giter VIP logo

cesium-terrain-builder-docker's Introduction

Cesium Terrain Builder Docker

This repo contains a Dockerfile for the Cesum Terrain Builder (CTB) app with support for the new Cesium terrain format quantized-mesh. It is build from a fork providing quantized-mesh support, as described in this artice. Information on the most recent development of this fork is available in this pull request. Thanks to @homme and @ahuarte47 for the great work on Cesium Terrain Builder and quantized-mesh support.

Note: The images are manually rebuild, when new commits are published at ahuarte47/cesium-terrain-builder/tree/master-quantized-mesh. If you miss an update in an image, please let us know by creating an issue.

If you experience problems or want to contribute please create an issue or pull request.

Follow the steps below to create your own quantized-mesh tiles for Cesium using this Docker image.

News

  • 2023-08-06:

    • The additional arm64 image ins now available from both Dockerhub and Github packages.

      docker pull ghcr.io/tum-gis/ctb-quantized-mesh:latest

      docker pull ghcr.io/tum-gis/ctb-quantized-mesh:alpine

  • 2023-07-31:

    • An additional arm64 version of the image was added. This currently untested and I'm happy for any feedback on this, see #19. The arm64 Docker images are hosted in Github packages.

      docker pull ghcr.io/tum-gis/ctb-quantized-mesh:latest

      docker pull ghcr.io/tum-gis/ctb-quantized-mesh:alpine

  • 2023-03-06:

  • 2020-11: Updated alpine image to Alpine v3.12 and GDAL v3.14

  • 2020-11: Reduced size of all images using multi stage builds.

Image variants

The amd64 Docker images are available on DockerHub from tumgis or from Github packages. To get the image run:

docker pull tumgis/ctb-quantized-mesh:<TAG> or docker pull ghcr.io/tum-gis/ctb-quantized-mesh:<TAG>

The arm64 Docker images are ONLY available from Github packages. To get the image run:

docker pull ghcr.io/tum-gis/ctb-quantized-mesh:<TAG>

Following tags are available:

Tag Build status Arch Description
latest Build Status Build status amd64 arm64 Latest image build based on Debian and GDAL 2.4.0
alpine Build Status GitHub Workflow Status (with event) amd64 arm64 Image based on leightweight Alpine Linux v3.12 and GDAL v3.14

Content

Preparation

Docker settings

The system resources Docker can use are limited by default on Windows systems. Goto Docker tray Icon -> Settings -> Advanced to adjust the number of cores and main memory Docker can use to increase performance.

Data pre-processing

It is highly recommended (but not required) to transform your data to the WGS84 (EPSG:4326) coordinate reference system before using CTB. This helps to avoid vertial or horizontal offsets of terrain datasets. Use the NTv2 transformation method if available. This is e.g. supported by FME using the EsriReprojector transformer or ESRI ArcGIS.

Data storage

Put your data in a folder, that can be mounted by Docker. On Windows, you will have to grant access to the drive where the data is located before being able to mount the folder. Goto Docker tray Icon -> Settings -> Shared Drives to share drives with Docker. Visit this blog post for a comprehensive guide on mounting host directories on Windows.

In the following we assume that your terrain data is stored in d:\docker\terrain for a Windows Docker host and drive d:\ is shared with Docker. For a Linux Docker host we assume your data is stored in /docker/terrain.

Cesium Terrain Builder usage

When your data is transformed and copied to a location available for Docker your are ready for creating a Cesium terrain with CTB.

Start CTB container and mount data folder

Before starting CTB it is recommended to pull the latest image version using docker pull tumgis/ctb-quantized-mesh. After that, start a CTB container and mount your terrain data folder to /data in the container. Follow the examples below for different operating systems and shells.

Linux - bash

docker run -it --name ctb \
    -v "/docker/terrain:/data" \
  tumgis/ctb-quantized-mesh

Windows - cmd

docker run -it --name ctb ^
    -v "d:/docker/terrain:/data" ^
  tumgis/ctb-quantized-mesh

Windows - git-bash

winpty docker run --rm -it --name ctb \
    -v "d:\\docker\\terrain:/data" \
  tumgis/ctb-quantized-mesh

Windows - powershell

docker run -it --name ctb `
    -v "d:\docker\terrain:/data" `
  tumgis/ctb-quantized-mesh

Create a GDAL Virtual Dataset (optional)

If you dataset consists of a single file, continue to the next step. If your dataset consists of multiple tiles (more than one file), a GDAL Virtual Dataset needs to be created using the gdalbuildvrt app.

gdalbuildvrt <output-vrt-file.vrt> <files>

For instance, if you have several *.tif files, run:

gdalbuildvrt tiles.vrt *.tif

More options to create a GDAL Virtual Dataset e.g. using a list of files are described in the gdalbuildvrt documentation.

Create Cesium Terrain files

First, create an output folder for you terrain, e.g. mkdir -p terrain. Second, run CTB to create the terrain files:

ctb-tile -f Mesh -C -N -o terrain <inputfile.tif or input.vrt>

For example, if a tile.vrt has been created as described above:

ctb-tile -f Mesh -C -N -o terrain tile.vrt

The ctb-tile app supports several options. Run ctb-tile --help to display all options. For larger datasets consider setting the -m option and the GDAL_CHACHEMAX environment variable as described here.

Create Cesium layer description file

Finally, a layer description file needs to be created. Simply run the same command you used for creating the terrain files again adding the -l switch. For instance:

ctb-tile -f Mesh -C -N -o terrain tiles.vrt            # Create terrain files
ctb-tile -f Mesh -C -N -l -o terrain tiles.vrt         # Create layer description file

Finally, your terrain data folder should look similar to this:

$ tree -v -C -L 1 terrain/
terrain/
|-- 0
|-- 1
|-- 2
|-- 3
|-- 4
|-- 5
|-- 6
|-- 7
|-- 8
|-- 9
|-- 10
|-- 11
|-- 12
|-- 13
|-- 14
|-- 15
`-- layer.json

The quantized-mesh terrain is now ready for usage.

Troubleshooting

Performance issues

Read the recommendations for ctb-tile carefully, especially when handling large datasets.

Handling large datasets

Datasets with a big extent can lead to overflow errors on lower zoom levels:

0...10...20...30...40...50...60...70...80...90...ERROR 1: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: IReadBlock failed at X offset 0, Y offset 0: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: IReadBlock failed at X offset 0, Y offset 0: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: IReadBlock failed at X offset 0, Y offset 0: IReadBlock failed at X offset 0, Y offset 0: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: IReadBlock failed at X offset 0, Y offset 0: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: IReadBlock failed at X offset 0, Y offset 0: IReadBlock failed at X offset 0, Y offset 0: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: IReadBlock failed at X offset 0, Y offset 0: Integer overflow : nSrcXSize=41494, nSrcYSize=16585
ERROR 1: IReadBlock failed at X offset 0, Y offset 0: IReadBlock failed at X offset 0, Y offset 0: Integer overflow : nSrcXSize=41494, nSrcYSize=16585

As described here, this is caused by GDAL trying to create overviews from input data. A possible solution is to create simplified versions of the input data with lower resolutions and use them for creating the mesh tiles on lower levels. This can be done using e.g. gdal_translate. After that, try to create mesh tiles using ctb-tile with the resolutions that do not crash starting from level 0. Try to use the highest resolution possible that does not crash for each level.

cesium-terrain-builder-docker's People

Contributors

bwibo avatar t16h05008 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cesium-terrain-builder-docker's Issues

Starts numbering at 10 instead of 0

Hi,

when I follow the instructions I get the following structure:

terrain/
|-- 10
|   `-- 1113
|-- 11
|-- 12
|-- 13
|-- 14
|-- 15
|-- 16
|-- 17
|-- 18
`-- layer.json

How can I fix the numbering?

I guess that's the reason why the terrain is not displayed.

Thanks for any help

when Create layer description file, ctb-tile core dump

In my centos7(memory:32G):

  1. docker run -it --name ctb -v "/data/maping/to3dtile/dsm":"/data" tumgis/ctb-quantized-mesh
  2. ctb-tile -f Mesh -C -N -o out dsm.tif note: the dsm.tif is 82MBytes from opendronemap
  3. It uses 2minutes to finish the above process
  4. ctb-tile -f Mesh -C -N -l -o out dsm.tif
  5. The computer memory used by ctb-tile increase to > 90% and core dump
  6. Test data

Tile coordinates are not consistent with Google or TMS standard

Hey @BWibo ,

I am confused that the coordinates of generated tile are quite different from the Google standard or TMS standard. For example:

Tile(x=69555, y=54636, z=16) is what I got from cesium-terrain-builder-docker. However, the corresponding tile coordinates in Google standard are Tile(x=69555, y=38016, z=17) + Tile(x=69555, y=38017, z=17).

Or Tile(x=69555, y=93055, z=17) + Tile(x=69555, y=93054, z=17) in TMS standard.

In addition, each tile generated from cesium-terrain-builder-docker looks like a rectangle rather than a square. But tiles using Google standard or TMS standard are all squares.

I would like to know how to convert the tile coordinates to those using Google standard or TMS standard. Thanks a lot.

Oliver

std::bad_alloc when trying to generate CTB with layer.json file

Hello,

Thank you for the amazing work.

I have run into this issue, i was hoping someone can provide some clarity.

When i add the -l argument to generate a layer.json file i get "terminate called afterthrowing an instance of std::bad_alloc" what(): std::bad_alloc.. aborted

can anyone please help me on this?

I am new to docker and C++.

Please and thank you!

Kind Regards
Vamshi

Unable to run on docker - windows

Docker container runs successfully
But unable to find terrain tile. I used following commands on command prompt:
docker run --rm -it --name ctb -v //d/docker/terrain:/data tumgis/ctb-quantized-mesh

ctb-tile -f Mesh -C -N -o terrain dsm.tif

Following error is given:
ERROR 4: dsm.tif: No such file or directory
Error: could not open GDAL dataset

i've tried many ways to give paths. Please help.

Question: tiled quantized mesh is 700 MB while traditional terrain is 40MB

Hi,

I think this is a great tool! I just tried it and I am wondering the following command: "ctb-tile -f Mesh -C -N -o ./output input.tif" and it is 700MB, while if I tried the original terrain it is 40 mb using "ctb-tile -C -N -o ./output input.tif". I thought quantized mesh would produce a lighter tiled model. Am I doing something wrong? Thanks

Segmentation violation when using --profile mercator on tumgis/ctb-quantized-mesh

Hi,

I noticed the --profile mercator option gives an segmentation violation on Docker image tumgis/ctb-quantized-mesh but not on tumgis/ctb-quantized-mesh:alpine.

Sample on tumgis/ctb-quantized-mesh:

$ ctb-tile -v -f Mesh --profile mercator -C -N -e 0 -s 10 -o tiles test.tif
Segmentation fault

Any idea why this function works on tumgis/ctb-quantized-mesh:alpine but not on tumgis/ctb-quantized-mesh ?

I prefer to use tumgis/ctb-quantized-mesh instead of tumgis/ctb-quantized-mesh:alpine (because other tooling on that Docker image)

GDALOpenEx not found in Windows

I've been trying to build ctb on a Windows machine for the last few days and keep running into this error.

For context, I've installed gdal (v3.4.1) via conda. Following are my build logs:

(geo) PS C:\Users\ash19\cesium-terrain-builder\build> cmake -G "MinGW Makefiles" ..
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- The C compiler identification is GNU 11.2.0
-- The CXX compiler identification is GNU 11.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test COMPILER_SUPPORTS_CXX11
-- Performing Test COMPILER_SUPPORTS_CXX11 - Success
-- Performing Test COMPILER_SUPPORTS_CXX0X
-- Performing Test COMPILER_SUPPORTS_CXX0X - Success
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Found GDAL: C:/Users/ash19/miniconda3/envs/geo/Library/lib/gdal_i.lib (found version "3.4.1")
-- Looking for GDALOpenEx in gdal
-- Looking for GDALOpenEx in gdal - not found
CMake Error at src/CMakeLists.txt:10 (message):
  The GDAL version must be one that implements RFC 46 (GDAL/OGR unification)
  i.e.  >= 2.0.0


-- Configuring incomplete, errors occurred!
See also "C:/Users/ash19/cesium-terrain-builder/build/CMakeFiles/CMakeOutput.log".
See also "C:/Users/ash19/cesium-terrain-builder/build/CMakeFiles/CMakeError.log".
(geo) PS C:\Users\ash19\cesium-terrain-builder\build>

Looking at the error log, it seems this is caused by -lgdal not being found. I've tried explicitly specifying the path but it didn't work. Hope someone can point me in the right direction.

Error logs

(geo) PS C:\Users\ash19\cesium-terrain-builder\build> cat "C:/Users/ash19/cesium-terrain-builder/build/CMakeFiles/CMakeError.log"
Determining if the function GDALOpenEx exists in the gdal failed with the following output:
Change Dir: C:/Users/ash19/cesium-terrain-builder/build/CMakeFiles/CMakeTmp

Run Build Command(s):C:/MinGW/bin/mingw32-make.exe cmTC_d8986/fast && C:/MinGW/bin/mingw32-make.exe  -f CMakeFiles\cmTC_d8986.dir\build.make CMakeFiles/cmTC_d8986.dir/build

mingw32-make.exe[1]: Entering directory 'C:/Users/ash19/cesium-terrain-builder/build/CMakeFiles/CMakeTmp'

Building C object CMakeFiles/cmTC_d8986.dir/CheckFunctionExists.c.obj

C:\msys64\mingw64\bin\gcc.exe   -DCHECK_FUNCTION_EXISTS=GDALOpenEx -o CMakeFiles\cmTC_d8986.dir\CheckFunctionExists.c.obj -c C:\Users\ash19\miniconda3\envs\geo\Library\share\cmake-3.19\Modules\CheckFunctionExists.c

Linking C executable cmTC_d8986.exe

C:\Users\ash19\miniconda3\envs\geo\Library\bin\cmake.exe -E cmake_link_script CMakeFiles\cmTC_d8986.dir\link.txt --verbose=1

C:\Users\ash19\miniconda3\envs\geo\Library\bin\cmake.exe -E rm -f CMakeFiles\cmTC_d8986.dir/objects.a
C:\msys64\mingw64\bin\ar.exe cr CMakeFiles\cmTC_d8986.dir/objects.a @CMakeFiles\cmTC_d8986.dir\objects1.rsp
C:\msys64\mingw64\bin\gcc.exe  -DCHECK_FUNCTION_EXISTS=GDALOpenEx -Wl,--whole-archive CMakeFiles\cmTC_d8986.dir/objects.a -Wl,--no-whole-archive -o cmTC_d8986.exe -Wl,--out-implib,libcmTC_d8986.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\cmTC_d8986.dir\linklibs.rsp
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lgdal: No such file or directory

collect2.exe: error: ld returned 1 exit status
CMakeFiles\cmTC_d8986.dir\build.make:106: recipe for target 'cmTC_d8986.exe' failed

mingw32-make.exe[1]: *** [cmTC_d8986.exe] Error 1

mingw32-make.exe[1]: Leaving directory 'C:/Users/ash19/cesium-terrain-builder/build/CMakeFiles/CMakeTmp'

Makefile:139: recipe for target 'cmTC_d8986/fast' failed

mingw32-make.exe: *** [cmTC_d8986/fast] Error 2

cc @ahuarte47

Cannot visualize with CesiumJS

Hello,

I am trying to use the mesh output with CesiumJS.

I am getting the error:
Cesium.js:452 An error occurred in "w": Failed to obtain terrain tile X: 1 Y: 0 Level: 0.
Cesium.js:452 An error occurred in "w": Failed to obtain terrain tile X: 0 Y: 0 Level: 0.

I asked this question also in the cesium-dev Google group. You can find my question at https://groups.google.com/forum/#!topic/cesium-dev/bmH_Rp4FkDY.

Are you familiar with this error? Can you guess what I am doing wrong?

I am using CesiumJS version 1.50.

Thanks.

arm64 based Docker image

Hello, could you provide an arm64 based Docker image? If possible, thank you very much!!!

How to view the results in Cesium?

I successfully created a bunch of .terrain files. But I still don't know how to view them in Cesium. Could anyone share me some documents or examples of using the results generated by the tool?

Normals not working/missing

Hello,

I have generated some quantized mesh terrain files from a GeoTIFF using this repository, thank you very much for the only codebase that just plain works for making these for Cesium!

That being said, even though the terrain files work brilliantly in every other aspect, Cesium doesn't seem to think the normals were generated, despite the fact that I used the -N flag when creating the terrain files, and I have "requestVertexNormals: true" when creating the CesiumTerrainProvider that uses these files.

viewer.terrainProvider.hasVertexNormals returns false, and this code renders the terrain all the same shade of grey (for SlopeRamp) or black (for AspectRamp):

material = Cesium.Material.fromType('SlopeRamp');
globe.material = material;

material = Cesium.Material.fromType('AspectRamp');
globe.material = material;

I may be doing something wrong, but as I have no other way to check that the normals were correctly generated other than trying to use them in Cesium itself, I'm not sure how to double check that the normals are really there.

How to resume tiling terrain after stopping

Hi @BWibo,

I am tiling a slightly large area with 77 .tif files (around 70GB). However, the power in the lab was out yesterday and hence led to shutting down the tiling at the level 18.

The current terrain tiles at level 18 have 4500+ .terrain files and I am sure it has not been finished yet. So, is it possible to resume the tiling instead of starting it from scratch again? Because it has already taken more than 30 hours to get these .terrain files at level 18.

Looking forward to your reply and thanks in advance!

Oliver

Failed to obtain terrain tile X: 1 Y: 0 Level: 0.

the url is current(exist 0/0/0.terrain and 0/1/0.terrain), but it seems to failed in the createQuantizedMeshTerrainData method which vertexCount is very large and more than the terrain size. An error occurs in this line.

Gdal version?

Hi, I noticed that GDAL 2.4.0 from 2018 in this Docker image (tumgis/ctb-quantized-mesh:latest)

$ gdalinfo --version
GDAL 2.4.0, released 2018/12/14

Is it possible to upgrade to 3.7 (2023)?

Not able to build terrain

I'm using Docker in windows 10

Using the following commands:

docker run -v "${PWD}:/data" -it --name ctb tumgis/ctb-quantized-mesh

ctb-tile -f Mesh -C -N -o ./tilesets/terrain/test a.tif

Sometimes it's failing, by giving the following output:

0...10...20...30...40...Killed

so I'm using the following command for resuming the terrain building process:

ctb-tile -f Mesh -R -C -N -o ./tilesets/terrain/test a.tif

It giving the following errors at the end:

root@e594ebe1722d:/data# ctb-tile -f Mesh -R -C -N -o ./tilesets/terrain/test a.tif
0...10...20...30...40...50...60...70...80...90...ERROR 2: gdalwarpoperation.cpp, 1574: cannot allocate 814172736 bytes
ERROR 1: IReadBlock failed at X offset 0, Y offset 0
ERROR 1: GetBlockRef failed at X block offset 0, Y block offset 0
ERROR 2: gdalwarpoperation.cpp, 1574: cannot allocate 814172736 bytes
ERROR 1: IReadBlock failed at X offset 0, Y offset 0
ERROR 1: GetBlockRef failed at X block offset 0, Y block offset 0
100 - done.

quantized-mesh tiles are no “metadata” extension

I used this cmd in windows to produced terrain tiles

ctb-tile -o D:\dem\globe d:\dem\world-16bit.tif -f Mesh -s 10 -e 0

but when load by cesiumJS ,i found a problem,there is no “metadata” extension in 0/0/0.terrain and 0/1/0.terrrain.And the "metadata" is very important for cesiumJS to create quadtree,so it's absolutely need “metadata” extension in level0 and level10.We can see the code at https://github.com/CesiumGS/cesium/blob/7d7c5d06e712e71b7002f70100da8689080a3144/Source/Core/CesiumTerrainProvider.js#L308-L354
When i searched this problem at cesium community,i also found a similar post:https://community.cesium.com/t/terrain-loading-failed-in-ctb-production/14161

Cesium for Unreal and CeisumJS currently requires that tile availability be attached to quantized-mesh tiles using the “metadata” extension.

So what should i do To add the “metadata” ?

Thanks!

why cesium can not display globe?

There was a problem loading the terrain in cesium. The cesium globe displays normally after removing the terrain.
In cesium1.96, chrome displays the following error:
Cesium.js:85 An error occurred in "Py": Failed to obtain terrain tile X: 0 Y: 0 Level: 0. Error message: "RangeError: Invalid typed array length: 8894653434"
Cesium.js:85 An error occurred in "Py": Failed to obtain terrain tile X: 1 Y: 0 Level: 0. Error message: "RangeError: Invalid typed array length: 2017542741"

cesium code like this:
var terrainProvider1=new Cesium.CesiumTerrainProvider({
url:"http://localhost:9000/"
});
const viewer = new Cesium.Viewer("cesiumContainer", {
baseLayerPicker: false,
imageryProvider: imageryProvider,
terrainProvider:terrainProvider1
});
viewer.scene.globe.enableLighting=true;

However, in the latest cesium, chrome does not output any errors and just does not display the globe.
How can I solve this problem? @BWibo @Son-HNguyen @TatjanaKutzner @thomashkolbe

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.