A standalone version of Urban Pulse
Urban Pulse is a framework that uses computational topology techniques to capture the pulse of cities. This is accomplished by first modeling the urban data as a collection of time-varying scalar functions over different temporal resolutions, where the scalar function represents the distribution of the corresponding activity over the city. The topology of this collection is then used to identify the locations of prominent pulses in a city. The framework includes a visual interface that can be used to explore pulses within and across multiple cities.
The framework was first presented in the paper:
Urban Pulse: Capturing the Rhythm of Cities
Fabio Miranda, Harish Doraiswamy, Marcos Lage, Kai Zhao, Bruno Gonçalves, Luc Wilson, Mondrian Hsieh and Cláudio T. Silva
IEEE Transactions on Visualization and Computer Graphics, 23 (1), 2017, 791-800.
The team includes:
Urban Pulse has also been feature on The Economist, Architectural Digest, Curbed and GCN.
A live demo can be accessed on vgc.poly.edu/projects/urban-pulse/.
A video is available here.
The following are prerequisites for all systems:
Download Qt 5.8 (or later version) at qt.io/download-open-source and install it.
Install GCC 4.8 (or later version)
sudo apt-get install gcc-4.8 g++-4.8
Install Java SE Development Kit 8, set up its environment variables and install Apache Ant:
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default
sudo apt-get install ant
Install Node.js:
sudo apt-get install nodejs npm
Download Homebrew, a package manager for macOS, at brew.sh and install it.
Download Qt 5.8 (or later version) at qt.io/download-open-source and install it.
Install GCC through XCode or brew:
brew install [email protected]
Install Java SE Development Kit 8 and Ant:
brew cask install java
brew install ant
Install Node.js:
brew install nodejs npm
Please make sure to update the correct paths for macx in ComputePulse/PulseJNI/Pulse.pro
QMAKE_LFLAGS
QMAKE_CXXFLAGS
We first need to create a .jar file containing the computational topology functions. Open a command line interface and follow the steps:
cd ComputePulse
ant build
This will create a TopoFeatures.jar file inside the ComputePulse/build
folder. Next, we need to compile the C++ code. In the same ComputePulse
folder, type:
qmake ComputePulse.pro
This will generate a Makefile with the compilation steps.
To compile on Windows:
mingw32-make
To compile on Ubuntu, Linux Mint or macOS:
make
Two new executables, Scalars
and Pulse
will be created in the ComputePulse/build
folder.
The Urban Pulse framework takes as input a simple comma-separate value data file (i.e. CSV file), with some activity measurements. In this example, we are going to use the Flickr data set, which contains spatial and temporal information of pictures taken all over the world. In order to simplify the example, we have made available two CSV files, with latitude, longitude and epoch time of pictures taken in New York City (flickr_nyc.csv) and San Francisco (flickr_sf.csv).
Below, the first few lines of the New York City data set:
40.740067,-73.985495,1338164610
40.748472,-73.985700,1335191997
40.742188,-73.987924,1352021337
In this example, each row is going to count as one measurement when computing the scalar function, since we are interested in the activity of pictures taken in NYC and San Francisco. The CSV file, however, can also contain a weight column (e.g. taxi fare), which can be considered when computing the function.
With both Scalars
and Pulse
executables properly compiled, we are ready to compute the pulse features. The first step is to compute the scalar values for each city. Go to the folder containing the Scalars
executable and run:
./Scalars --input ./flickr_nyc.csv --name flickr --space 0 1 --time 2 --bound 40.6746 -74.0492 40.8941 -73.8769 --timezone UTC --output ../vis/src/data/nyc/
The previous line takes as an input the flickr_nyc.csv
file, attribute the name flickr
to it, and considers the first and second columns as the spatial ones and the third column as the temporal one. The bound
argument ignores the CSV lines with latitude and longitude coordinates falling outside the rectangle 40.6746 -74.0492 40.8941 -73.8769
. The timezone
argument adjusts the temporal column to the given UTC time zone. Finally, the output
argument dictates where the output files should be saved.
Similarly, we can also run Scalars
for San Francisco:
./Scalars --input ./flickr_sf.csv --name flickr --space 0 1 --time 2 --bound 37.6542 -122.534 37.8361 -122.344 --timezone UTC --output ../vis/src/data/sf/
The second step is to generate the pulse features for each city:
./Pulse --name flickr --data ../vis/src/data/nyc/ --create
./Pulse --name flickr --data ../vis/src/data/nyc/ --combine
The above lines consider as an input the files outputted in the first step (--data ../vis/src/data/nyc/
) and first creates and then combines the pulses into a JSON file saved in the supplied folder.
In order to visualize the pulses computed previously, the Urban Pulse framework also provides an interactive visualization interface. To run it, open a command line interface and navigate to the vis
folder. A development server can be started by running ng serve
. Open a web browser and navigate to http://localhost:4200/
. The app will automatically reload if you change any of the source files.
In order to load the pulses, you must supply a path to the folder storing the files (relative to the vis/src
folder), the name of the data set, and a temporal filter. For instance, consider the following address:
http://localhost:4200/?data1=data/nyc,flickr,none&data2=data/sf,flickr,none
The argument data1
indicates that the computed pulse files are located in the folder data/nyc
(i.e. vis/src/data/nyc
), named flickr
and we want to visualize the pulses without any temporal filter. The argument data2
follows the same idea.
If instead we want to only consider measurements that fall inside a given temporal filter, we can use the following filters:
winter
, spring
, summer
or fall
for filtering based on season.day
or night
for filtering based on time of day.week
or weekend
for filtering based on day of week.Note that the data folder must be inside vis/src
because ng serve
will only serve files that are inside it.
The image below shows the interface of Urban Pulse:
The maps on the left show the computed pulses in each city. Pulses can be selected by brushing with one of the selection tools available on the top part of each map. To deselect a brush, right click on top of the brush.
The pulse similarity search mode can be activated by choosing Map1
or Map2
.
Enables the display of the scalar function for the temporal resolution selected in 4.
Selects a temporal resolution.
Shows the pulses in three different temporal resolutions. If pulse similarity search mode is selected, displays a single plot with the similarity measures for all selected pulses: