<div dir="ltr"><div>Hi,<br><br></div>given the json x3d activity and availability of firebase as performant, easy to use, online json database engine, I started to think about a json structure for tiled elevation grid data.<br><div><div><div><br></div><div>As an example dataset I am using a global 1km (30 arcsecond) resolution dataset, cut down to the continental U.S. or California.<br><br></div><div>The simplest structure is an untiled, flat list like this:<br></div><div>{ "lon1:lat1" : elev1,<br>  "lon2:lat2" : elev2,<br> ... }<br></div><div>I transformed the dataset to this structure, and uploaded the json to firebase. It works as expected, eg. you can query the database but you need to know the exact keys, or array of keys for an area. It is actually pretty fast.<br></div><div><br></div><div>This where tiling comes in. My favorite idea sofar is to use the digits of lon.,lat. as hierarchical keys, with an addtional key "h" for the actual data. For a three by three digit, one degree grid, It would look like this:<br><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">{"0:0" : {"h": h00_ave,<br></span></div><div><span style="font-family:monospace,monospace">          "0:0" : { "h": h00_ave,<br></span></div><div><span style="font-family:monospace,monospace">                   </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"> "0:0" : { h: elev },<br>                   </span></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"> "0:1" : { h: elev }, ...<br></span></span></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">                    "9:9" : { h: elev }<br>                  },</span></span></span></span><br><div><span style="font-family:monospace,monospace">          "0:1" : { "h": h01_ave,</span><br><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">                   </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"> "0:0" : { h: elev },<br>                   </span></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"> "0:1" : { h: elev }, ...<br></span></span></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">                    "9:9" : { h: elev }<br>                  }, ...</span></span></span></span></span><br><div><span style="font-family:monospace,monospace">          "9:9" : { "h": h99_ave,</span><br><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">                   </span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"> "0:0" : { h: elev },<br>                   </span></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"> "0:1" : { h: elev }, ...<br></span></span></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">                    "9:9" : { h: elev }<br>                  }</span></span></span></span></span><br>  <span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">"0:1" : </span></span></span></span><span style="font-family:monospace,monospace">{"h": h01_ave, //100N does not actually exist</span> <br><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">          "0:0" : { ... }, ...<br></span></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">          "9:9" : { ... }<br>         }, ...<br> "9:9" : { ... }<br>}<br></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"> <br></span></span></div>The elev. data are actual elevation, the h??_ave value are representative (average) elevation for a complete tile.<br><br>A json path to an elevation at 123E longitude and 40N latitude looks like this:<br><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">/1:0/2:4/3:0/h<br></span></span><div>A json path to all elevations in the area between 120 and 129E longitude and 40 and 49N latitude is:<span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><br>/1:0/2:4/<br></span></span></div>This path refers to an object:<span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><br>{ "h": 356, //average elevation in this area<br></span></span><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">  "0:0" : {"h": 344 }, // ...<br></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">  "9:9" : {"h": 377 }<br>}<br><br></span></span></div>which has all grid point elevations in this 10x10 degree tile.<br>So 129E,049N has an elevation of 377.<br><br>Hm, there is an issue. A json path<span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><br>/2:0/<br></span></span><div>would refer to an area between 200E,000N to 299E,099N and would require loading all of the subtree although we are only interested in the h??_ave values.<span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><br></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">-Andreas<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br>Thinking out loud: This probably means putting the tile level first in the hierarchy like in slippy maps. The tile level would be the number of significant digits.<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">/3/0:0  //average for 000:000 to 099:099<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">/2/0:0  //average for 000:000 to 009:009<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">/2/1:0  //average for 010:000 to 019:009<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">/2/ // all averages in 10x10 cells<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">/1/222:89 // data in 222:89<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">/1/ // all data in 1x1 cells<br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">looks better ...<br><br><br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><br></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><br></span></span></div><div><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><br></span></span><br></div></div><span style="font-family:monospace,monospace"></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">                   </span>                   </span></span>  <br>                            <br></span></div><div><br></div><div><br><br></div><div><br><br clear="all"><br>-- <br><div class="gmail_signature">Andreas Plesch<br>39 Barbara Rd.<br>Waltham, MA 02453</div>
</div></div></div></div>