The map miner tool enables interactive exploration of player position over time. A timeline shows the number of active players on a server over time. The map shows the position of those players over the selected time period. The map can be zoomed and moved interactively and updates in updates continuously while selecting or moving the time frame.


Try the interactive demo or download the source code. The background processing API is explained in a blog post.


The dataset is quite large (almost 20 MB) and can take a couple of minutes to download and process. Once the map appears, use the mouse to drag the map and zoom by using the scroll wheel (similar to Google Maps). The timeline can be moved and zoomed the same way. The shown player positions can be limited to a time frame by making a selection on the gray bar. The selection can be moved and the map updates permanently.

Map Miner works best on Google Chrome, but has also been tested on Safari for Mac and iOS. On a touch based device, use multitouch gestures for pan and zoom.

The provided dataset contains much more data than displayed in the demo. Players could for example be shown in different colors. The code also contains a behavior classifier and there are (commented out) segments to add time bars visualizing different player behavior over time. Feel free to experiment with the code and contact us if you have any questions. We can also provide datasets for your own server if you have the Epilog plugin installed.

File Format

The file used to create the visualizations is based on JSON. The object at the root level contains 4 keys: step, enum, timeline, pos.

	"step" : 180000,
	"enum" : { … },
	"timeline" : { … },
	"pos" : { … }

The step key contains an integer, representing the number of milliseconds between two data points (180000 for 3 minutes). enum is used to assign integers to repeatedly used strings. Those strings can be referred by their assigned integer in the dataset to save space. Our demo data set contains 4 enum dictionaries: player, world, event and material. The enum dictionaries contain the string as their key, and the assigned integer as its value. Since the UUIDs have been anonymized, player and world might only contain one entry. The structure of enum entries is data['enum'][<enum_name>][<value_string>] = <value_integer>.

timeline contains all recorded player events and is used mostly for player behavior classification. The structure is data['timeline'][<timebase>][<player_enum>] = {<event_count>}. timebase is the start time of the sample in milliseconds. The sample lasts step milliseconds. All events that occurred during the sampling period are accumulated in the event_count dictionary: event_count[<event_enum>] = <n_occurrences>.

pos contains how long a player stayed at a particular position. Player positions are quantized to blocks and the y coordinate (player height) is ignored. The data is stored in the format data['pos'][<world_enum>][<timebase>][<player_enum>] = [<position>, …]. The position array contains coordinates and duration for all player positions during the sample period in the format [pos_x, pos_z, dt].