Chicago’s New Babylon

This semester, I will be exploring Constant Nieuwenhuys’ New Babylon project. I will be attempting to explore the criteria of the New Babylon structure and philosophies, and attempt to recreate the project in a modern city, such as Chicago. As Mark Wigley, author of Constant’s New Babylon, puts it, “New Babylon might be the liberating way of the future, or it could just as easily be a nightmarish pleasure prison.” The “nightmarish pleasure prison” seems more accurate when looking at the images and paintings produced by Constant, but the philosophy behind it questions how a modern city is formed and Constant proposed a new and liberating way to perceive the city. As Constant puts it, “The modern city is a thinly disguised mechanism for extracting productivity out of its inhabitants, a huge machine that destroys the very life it is meant to foster.” When viewing it from the perspective, the “pleasure prison” seems to represent what the city is today. Constant continues to explain, “The increasingly traumatized inhabitants have to take over the shaping of their own spaces to recover the pleasure of living.”

ChicagoBabylon

These spaces located within the New Babylon structure are very flexible. There is no natural lighting within and all spaces are air conditioned, so it gives the inhabitant the ability to change temperature, lighting, and the program is flexible enough to move walls, floors, materials, etc. But where does these spaces come from, and what occupies them? Constant’s proposed city wanted every individual to be a nomadic artist, part of a larger utopian city of never-ending labyrinths. Constant believes commercial and residential spaces will become obsolete once the New Babylon project is developed. Since people do not work anymore businesses are closed. Manufacturing districts will stay to house robots that produce all of our clothes, food, etc. All residential spaces will be changed to agriculture to provide the manufacturing plants with raw materials and allow the city to be self-sustainable (this makes up for the lack of sustainability from air conditioning the whole city). Historical buildings and parks will stay to maintain the identity of the city. To foster transportation major roads, and train rails will remain in the city under the structure, and runways/ helicopter pads will be on top of the structure for further transportation. Antennas and cranes will also remain in the city.

Chicago – What Stays

To access the parks, rail lines, etc. the structure will be held up by massive columns. The structure starts anywhere between 15 and 20 meters over the ground (50′-65′). These columns continue to rise anywhere from 30 to 60 meters above the ground (100′-200′). The columns will cover about 10 to 20 hectares (a space 328′-1466′ by 328′-1466′). Because of the structure being so massive and commercial space and businesses becoming obsolete, I am proposing that some of Chicago’s tall building are cleared out and retrofit to become the columns to this New Babylon structure.

How do we know where the structure is is built? How does Constant get the abstract paths through the city? These paths are based on a concept invented by the Situationist, known as psychogeography . This has to do with an inhabitants desires. These paths, referred to as the dérive, have no destination and are not planned. The paths are generated from contours in the architecture and geography, which subconsciously direct the travelers. I will look into technologies similar to MIT’s StarLogo project. “StarLogo is a programmable modeling environment for exploring the workings of decentralized systems — systems that are organized without an organizer, coordinated without a coordinator. With Logo, you can model (and gain insights into) many real-life phenomena, such as bird flocks, traffic jams, ant colonies, and market economies.” MIT’s Logo project draws and animates “turtles” (the travelers) paths as they cover “patches” (space) and is influenced by the patches (the architecture and geography). The Star Logo project is similar to the Logo project, but Star Logo is able to apply this to thousands of “turtles” instead of just one.

“Every aspect of the environment can be controlled and reconfigured spontaneously; Social life becomes architecture play; architecture becomes a flickering display of interacting desires.”

Plan Proposal

Naming Conventions

For the database it is important to set up conventions for naming our files so everyone knows what files are and it will be more organized. A few of us met today to define major categories and this is what we came up with. We can discuss this tomorrow further, so it is more suitable for everyones projects, but until then use this naming for the new database. Just a reminder… do not use spaces or upper case letters in your table names.

City Geom:
– ex. Sidewalks, City Limits, Streets, Building Footprints
– should ideally just be an “id” and “geom” column as this will be used mainly for visualizing in QGIS
– start layers in this category with cty_

Transportation:
– ex. Bus Routes, CTA Stops
– start layers in this category with trn_

Demographics:
– ex. Census by Block 2010, Income by Block 2000
– start layers in this category with dmo_

Landscape:
– ex. Parks, Trees
– start layers in this category with lnd_

Jurisdiction:
– ex. Police Districts, TIF Districts, Neighborhoods, Wards
– start layers in this category with jur_

Report:
– ex. Crime 2013, 311 Requests, Permits, Business Licenses
– start layers in this category with rpt_

Social:
– ex. Facebook API, Yelp API
– start layers in this category with soc_

Agent:
– ex. Customer, Alderman, Dogs
– start layers in this category with agt_

conventions

Another place to get data: https://opendata.socrata.com/
(worldwide, but has all Chicago Data Portal data and then some)

Advancing Chicago’s Walkable Network

GOAL THIS SEMESTER:

Analyze the walkability and popularity of areas in the Chicago Network and make changes to existing topologies and infrastructure to make less walkable areas become more walkable and advance walkability in the existing walkable neighborhoods.

WHERE WE LEFT OFF LAST SEMESTER:

Walkable Networks

HOW WE CAN USE WHAT WE’VE DONE FOR THIS SEMESTER:

We can use the data from last semester to determine both what areas are very walkable & popular and which areas are not popular and do not invite walking. This data can include sidewalk size, crime data, business license data, and even some API data to help find popularity. We can also integrate more layers into our system as we see fit.

Once we have determined the level of walkability for areas of the city. We can determine what changes need to occur in this area to promote walkability and social interaction, by determining what businesses may be missing, if more sidewalk space is needed, if more green space is needed, etc.

After determining these changes we can import it into our network and see if and how it can advance existing walkability in that area.

WHAT WE HAVE LOOKED AT SO FAR:

Business LicensesOtherLicenseRoutes

 

UML Diagram

UML Diagram

Making Routes and Visualizing in QGIS Using SQL

PgRouting analyzes graphs to find the shortest path between two nodes through edges. In a street network, you can think of nodes as intersections and edges as the streets themselves. I will be using the Chicago street network, which can be found here. I have also uploaded it to the server, named chicagostreets.

1. In order to develop data capable of using PgRouting a source and target geometry must be set up at the start and end of each road. These will serve as the start and end destination points. To perform this follow the “Creating a routable road network” section of this tutorial (blog also has many helpful QGIS tutorials). Another thing to get familiar with in SQL is the WITH Clause. This allows you to reference other SQLs within one query.

2. Once your network is made you can start routing. Follow this tutorial to get multiple options for routing. pgr_dijkstra and pgr_kdijkstraPath are two that work well for visualizing one path or one startpoint to many paths.

pgr_kdijkstraPath3. By joining the geometries in your network to the results of your routing you can import this into QGIS and see your paths.

To reference my SQL query from the tutorial in class, click link.

SQL and PgRouting Continued

In order to get pg routing to work, first a transportation network must be formed with a source and target column created to specify which start and end points are used. The SQL below creates a network  in a buffer of a 1 mile radius and examines the Damen CTA Stop. To alter the name of the table created, change the buffer distance, or to change the CTA Stop, change the red values in the SQL below.

CREATE TABLE damennetwork AS
WITH ctastop AS
(SELECT * FROM cta_railstations
WHERE gid = 32),
transpo AS
(SELECT
row_number() OVER (ORDER BY transportation.gid)::integer AS gid,
transportation.gid AS id, 
transportation.street_nam AS name,
transportation.length AS cost,
transportation.geom,
st_startpoint(ST_LineMerge(transportation.geom)) as source,
st_endpoint(ST_LineMerge(transportation.geom)) as target
FROM ctastop
LEFT JOIN transportation
ON st_within(transportation.geom, 
st_setsrid(st_buffer(ctastop.geom, 5280), 3435))),
nodes AS
(SELECT DISTINCT transpo.source AS gid 
FROM transpo
UNION
SELECT DISTINCT transpo.target AS gid 
FROM transpo)
SELECT transpo.gid, transpo.id, transpo.name, transpo.cost, transpo.geom, source.id as source, target.id as target
FROM transpo
JOIN 
(SELECT row_number() OVER (ORDER BY nodes.gid)::integer AS id, 
nodes.gid AS geom
FROM nodes
GROUP BY nodes.gid)
AS source ON transpo.source = source.geom
JOIN 
(SELECT row_number() OVER (ORDER BY nodes.gid)::integer AS id, 
nodes.gid AS geom
FROM nodes
GROUP BY nodes.gid) 
AS target ON transpo.target = target.geom

To be able to find a route with this SQL use the below SQL. Input the name of your table used in the previous SQL where there are the “damennetwork” in red. To change to start and end points, change to “502” and “341” respectfully.

SELECT seq,id1 as node, id2 as edge, route.cost, damennetwork.name as streetname, damennetwork.geom 
FROM pgr_dijkstra('
 SELECT gid AS id,
 source::integer,
 target::integer,
 cost::double precision AS cost
 FROM damennetwork', 502, 341, false, false ) 
AS route
LEFT JOIN damennetwork
ON route.id2 = damennetwork.gid;

What we have been working on is using the CTA stop as a start point and all the venues as the end points. The first thing I did was take all the venues in the same buffer as the network and corresponded them to their closest edge (the target). Different buffers and train stops can be chosen by the the red numbers.

WITH ctastop AS
(SELECT * FROM cta_railstations
WHERE gid = 32),
p AS
(SELECT
venues.gid AS gid, 
venues."legal name" AS company,
venues."doing busi" AS name,
venues.address AS address,
venues.latitude AS lat,
venues.longitude AS lon,
venues.geom AS geom
FROM 
ctastop
LEFT JOIN venues
ON st_within(venues.geom, 
st_buffer(ctastop.geom, 5280)))
SELECT rcost.*, p_to_l.targetID, p_to_l.geom FROM
(SELECT p.gid as restaurantID,
min(st_distance(p.geom,l.geom)) as distance
FROM p, damennetwork AS l
GROUP BY restaurantid) 
AS rcost
LEFT JOIN 
(SELECT p.gid as restaurantID, l.target as targetID, l.geom,
st_distance(p.geom,l.geom) as distance
FROM p, damennetwork AS l) 
AS p_to_l
ON rcost.distance = p_to_l.distance
AND rcost.restaurantID = p_to_l.restaurantID

The same must be done to find the start point (source) which is the CTA stop. Change to red value to select a different trainstop.

SELECT * FROM (WITH ctastop AS
(SELECT * FROM cta_railstations
WHERE gid = 32)
SELECT row_number() OVER (ORDER BY sourceid.distance)::integer AS gid,
sourceid.* FROM (
SELECT p.gid as restaurantID, l.source as sourceID, l.geom,
st_distance(p.geom,l.geom) as distance
FROM ctastop AS p, damennetwork AS l) as sourceid) as source
WHERE source.gid = 1

This gave me a result of a 292 start point, which I will be plugging into the next SQL (in red). The other numbers are the results from the venue target table formed two SQLs ago.

CREATE TABLE routetestwm AS
SELECT seq,id1 as path, id2 as node, id3 as edge, route.cost, damennetwork.name, damennetwork.geom
FROM pgr_kdijkstraPath('
 SELECT gid AS id,
 source::integer,
 target::integer,
 cost::double precision AS cost
 FROM damennetwork', 292, array[336,457,227,179,179,291,351,515,424,244,427,250,349,457,138,291,291,263,230,117,115,208,325,594,284,301,368,116,91,471,543,398,251,251,251,230,230,365,138,463,404,301,356,212,342,203,203,342,478,286,292,519,41,242,242,242,242,242,242,356,57,57,289,310,286,452,277,251,212,427,251,182,242,471,445,251,251,93,291,286,305,262,46,262,46,262,288,288,371,117,398,105,105,286], 
 false, false ) 
AS route
LEFT JOIN damennetwork
ON route.id3 = damennetwork.gid;

This table can be brought into qgis as the network of paths from a CTA stop to any venue.

All Routes

SQL and PG routing

In order to begin pgrouting you must first set up a a table containing all of your nodes and all of your edges.

My process started with taking all of the roads within a mile buffer of the train stop, finding the nodes at the intersections, then combining the data to create a usable network for routing. A simple tutorial on this can be found under the Create a Routable Road Network section on this blog post.

My interpretation is combined into one step below. Where it says damennetwork is where I name my table. This table will be referenced in the pgRouting SQL later. Anywhere that the SQL says 32 is where I am referencing the gid of the damen train stop. This can be changed to any CTA train stop in Chicago.

CREATE TABLE damennetwork AS
(SELECT transpo.gid, transpo.id, transpo.name, transpo.cost, transpo.geom, source.id as source, target.id as target
FROM
(SELECT
row_number() OVER (ORDER BY transportation.gid)::integer AS gid,
transportation.gid AS id,
transportation.street_nam AS name,
transportation.length AS cost,
transportation.geom,
transportation.geom AS source,
transportation.geom AS target
FROM
(SELECT * FROM cta_railstations
WHERE gid = 32) AS damen
LEFT JOIN transportation
ON st_within(transportation.geom,
st_setsrid(st_buffer(damen.geom, 5280), 3435)))
AS transpo
JOIN
(SELECT row_number() OVER (ORDER BY nodes.gid)::integer AS id,
nodes.gid AS geom
FROM (
SELECT DISTINCT transpo.source AS gid FROM
(SELECT
row_number() OVER (ORDER BY transportation.gid)::integer AS gid,
transportation.gid AS id,
transportation.street_nam AS name,
transportation.length AS cost,
transportation.geom,
transportation.geom AS source,
transportation.geom AS target
FROM
(SELECT * FROM cta_railstations
WHERE gid = 32) AS damen
LEFT JOIN transportation
ON st_within(transportation.geom,
st_setsrid(st_buffer(damen.geom, 5280), 3435))) AS transpo
UNION
SELECT DISTINCT transpo.target AS gid FROM
(SELECT
row_number() OVER (ORDER BY transportation.gid)::integer AS gid,
transportation.gid AS id,
transportation.street_nam AS name,
transportation.length AS cost,
transportation.geom,
transportation.geom AS source,
transportation.geom AS target
FROM
(SELECT * FROM cta_railstations
WHERE gid = 32) AS damen
LEFT JOIN transportation
ON st_within(transportation.geom,
st_setsrid(st_buffer(damen.geom, 5280), 3435))) AS transpo
) AS nodes
GROUP BY nodes.gid)
AS source ON transpo.source = source.geom
JOIN
(SELECT row_number() OVER (ORDER BY nodes.gid)::integer AS id,
nodes.gid AS geom
FROM (
SELECT DISTINCT transpo.source AS gid FROM
(SELECT
row_number() OVER (ORDER BY transportation.gid)::integer AS gid,
transportation.gid AS id,
transportation.street_nam AS name,
transportation.length AS cost,
transportation.geom,
transportation.geom AS source,
transportation.geom AS target
FROM
(SELECT * FROM cta_railstations
WHERE gid = 32) AS damen
LEFT JOIN transportation
ON st_within(transportation.geom,
st_setsrid(st_buffer(damen.geom, 5280), 3435))) AS transpo
UNION
SELECT DISTINCT transpo.target AS gid FROM
(SELECT
row_number() OVER (ORDER BY transportation.gid)::integer AS gid,
transportation.gid AS id,
transportation.street_nam AS name,
transportation.length AS cost,
transportation.geom,
transportation.geom AS source,
transportation.geom AS target
FROM
(SELECT * FROM cta_railstations
WHERE gid = 32) AS damen
LEFT JOIN transportation
ON st_within(transportation.geom,
st_setsrid(st_buffer(damen.geom, 5280), 3435))) AS transpo
) AS nodes
GROUP BY nodes.gid)
AS target ON transpo.target = target.geom);

When plugged into QGIS, this is the result:

damennetwork

 

 

…. TO BE CONTINUED

The Garbage Cans are Watching You

An advertising company, called Renew, is receiving backlash from inhabitants of London, for the sensors they have put in their “smart” trash bins. The bins, dubbed “smart” bins, measure the Wi-fi signals emitted by peoples cell phones and after multiple trash bins pick up the same wi-fi signal, the bins are able to determine the route that users took. Citizens of London have hit back and on August 12th officials demanded that all the bins be removed from the streets for personal privacy reasons.

Renew’s chief executive, Kaveh Memari, defends his product, explaining that the bins can track phone signals and recognize the same phones, but cannot determine who’s phone it is or any other personal message. The idea would be similar to web “cookies”. This is the tracking of files that follow internet users through the web, and with these trash cans using phone signals to identify users, Memari hopes that he can “cookie the street.”

Trash bins track peoples smart phones

Trash bins track peoples smart phones

This is something that could provide the opportunity to track people occupying public transport or track people at stops. This could provide the potential to know, for example, where a certain user enters a bus and where he gets off. This could potentially allow the buses to identify patterns between users to be able to identify more acceptable bus routes.