Bulk-Lookup von Adresszählungstrakt und Block


16

Gibt es eine kostenlose oder kostengünstige Möglichkeit, eine große Anzahl von Adressen zu codieren und den Zensus-Trakt zurückzugeben oder anzufügen und Daten zu blockieren?

Es gibt eine Reihe von Möglichkeiten, eine Adresse zu geocodieren und den Lat zu erhalten, aber ich muss wirklich den Zensus-Trakt abrufen und Daten blockieren.

Antworten:


16

Ok Ben, hier sind meine Annahmen:

1) Sie haben bereits Ihre Daten erhalten (ich hatte einige Adresspunkte in einem Shapefile und habe die Shapefiles für Zensus-Trakt und Zensus-Block für Missouri heruntergeladen).

2) Sie haben Ihre Adresspunkte bereits geokodiert und können die Daten problemlos projizieren.

3) Sie sind mit einer OGR / PostGIS- Lösung vertraut (beide kostenlos).

Im Folgenden finden Sie einige Installationshinweise, wenn Sie nicht über diese Software verfügen: So installieren Sie PostGREs mit PostGIS-Unterstützung . (Von BostonGIS. Bitte nehmen Sie den Titel nicht in Kauf, ich denke, es ist die beste Vorgehensweise.) Außerdem finden Sie hier eine , zwei und drei Websites, auf denen beschrieben wird, wie Sie GDAL / OGR mit Python-Bindungen installieren.

Vorsichtsmaßnahme : Bevor Sie die eigentliche Analyse durchführen (dh das folgendeST_ContainsMaterial), sollten Sie sicherstellen, dass sich alle Ebenen in derselben Projektion befinden ! Wenn Sie über Shapefiles verfügen, können Sie mit Quantum GIS (QGIS) oder OGR (oder mit ArcGIS, falls vorhanden ) problemlos von einer Projektion in eine andere konvertieren . Alternativ können Sie die Projektionstransformation in der Datenbank mit PostGIS-Funktionen durchführen. Wählen Sie im Grunde genommen Ihr Gift aus oder teilen Sie uns mit, ob dies ein Stolperstein ist.

Mit diesen Angaben habe ich mithilfe von PostGIS Traktat und Blockattriute an einige Adresspunktdaten angehängt:

Zuerst habe ich ogr2ogrdie drei Shapefiles in PostGIS importiert:

Adressen mit ogr2ogr importieren:

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "E:\path_to\addresses.shp" -nln mcdon_addresses -nlt geometry

Importieren Sie Zensus-Traktate (Missouri) mit ogr2ogr: Das spMoWestSuffix impliziert, dass ich meine Daten bereits in Missouri State Plane West Feet übersetzt habe.

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "E:\path_to\st_tract10_spMoWest.shp" -nln mo_tracts_2010 -nlt geometry

Blockdaten importieren (Missouri): Dieser Vorgang dauerte eine Weile. Tatsächlich stürzte mein Computer immer wieder ab und ich musste einen Lüfter darauf stellen! Oh, ogr2ogrich gebe auch kein Feedback, also werde nicht nervös. Achte darauf, dass du darauf wartest und es wird irgendwann zu Ende sein.

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "E:\path_to\st_block10_spMoWest.shp" -nln mo_blocks_2010 -nlt geometry

Starten Sie nach Abschluss des Datenimports PgAdmin III (die PostGREs-GUI), durchsuchen Sie Ihre Datenbank und geben Sie einige schnelle Wartungsbefehle ein, damit PostGREsql mit diesen neuen Daten schneller ausgeführt wird:

vacuum mcdon_addresses;
vacuum mo_tracts_2010;
vacuum mo_blocks_2010;

Als nächstes war ich neugierig, wie viele unformatierte Adresspunkte ich importiert habe, also habe ich einen kurzen Überblick gegeben COUNT(*). Normalerweise zähle ich zu Beginn einer solchen Aufgabe, um später bei "Sanity Checks" Fuß zu fassen.

SELECT COUNT(*) FROM mcdon_addresses;
-- 11979

In der nächsten Phase erstellte ich zwei neue Tabellen und fügte der ursprünglichen Adresspunktetabelle nach und nach die Traktattribute und dann die Blockattribute hinzu. Wie Sie sehen werden, hat die PostGIS- ST_ContainsFunktion die Schwerarbeit geleistet und in jedem Fall eine neue Punktetabelle erstellt, wobei jede die Attribute der Flächen und Blockpolygone erhielt, in die sie fielen.

Hinweis! Der Kürze halber nehme ich nur eine Handvoll Felder von jedem Tisch. Sie werden wahrscheinlich fast alles wollen . Ich sage fast, weil Sie das ogr_fidFeld (vielleicht sogar andere?) Aus den Tabellen, die Sie kombinieren, weglassen müssen, sonst beschweren sich PostGREs, dass beide Felder den gleichen Namen haben.

(PS: Ich habe hier herumgeschnüffelt, als ich das herausgefunden habe: http://postgis.net/docs/manual-1.4/ch04.html )

Erstellen Sie eine neue Tabelle mit Adresspunkten mit Tracts-Attributen: Hinweis : Ich stelle jeder Ausgabespalte einen Hinweis voran, der angibt, in welcher Tabelle sie begonnen hat (unten wird erläutert, warum).

CREATE TABLE mcdon_addresses_wtract AS
SELECT 
  a.wkb_geometry,
  a.route AS addr_route, 
  a.box AS addr_box, 
  a.new_add AS addr_new_add, 
  a.prefix AS addr_prefix, 
  a.rdname AS addr_rdname, 
  a.road_name AS addr_road_name, 
  a.city AS addr_city, 
  a.state AS addr_state, 
  a.zip AS addr_zip,
  t.statefp10 AS tr_statefp10, 
  t.countyfp10 AS tr_countyfp10, 
  t.tractce10 AS tr_tractce10,  
  t.name10 AS tr_name10, 
  t.pop90 AS tr_pop90, 
  t.white90 AS tr_white90, 
  t.black90 AS tr_black90, 
  t.asian90 AS tr_asian90, 
  t.amind90 AS tr_amind90, 
  t.other90 AS tr_other90, 
  t.hisp90 AS tr_hisp90
FROM
  mcdon_addresses AS a,
  mo_tracts_2010 AS t
WHERE 
  ST_Contains(t.wkb_geometry, a.wkb_geometry);

Pflegen Sie die Tabelle, damit PostGREs weiterhin reibungslos funktioniert:

vacuum mcdon_addresses_wtract;

Jetzt hatte ich zwei Fragen ..

Haben die ST_Contains tatsächlich funktioniert? ..und .. Ist die Anzahl der zurückgegebenen Adressen angesichts der von mir verwendeten Dateneingaben sinnvoll?

Ich konnte beide Fragen mit der gleichen Abfrage beantworten:

select count(*) from mcdon_addresses_wtract;
-- returns 11848

Ein kurzer Überblick über die Verluste: Zuerst habe ich in ArcGIS eingecheckt (Sie können dies auch in QGIS tun) und es wurde die gleiche Anzahl zurückgegeben. Warum also der Unterschied? Erstens fielen einige Adressen außerhalb von Missouri, und ich verglich sie nur mit einem Missouri-Traktat-Polygon. Zweitens scheint es bei näherer Analyse einige Beispiele für eine schlechte Digitalisierung in den Adressdaten zu geben. Insbesondere hatten viele der Punkte, die nicht erfasst wurden, ST_Containsleere Attributfelder, was ein gutes Zeichen dafür ist, dass beim Digitalisieren etwas schief gelaufen ist. es bedeutet auch, dass sie ohnehin nicht verwendbare Daten waren. An diesem Punkt bin ich mit den Unterschieden zufrieden, da ich vernünftigerweise zurückgehen und die Daten verbessern könnte, um eine sauberere Analyse zu ermöglichen.

Im nächsten Schritt wurde die Adress- / Traktatentabelle mit Attributen aus den Blockdaten angehängt. In ähnlicher Weise habe ich dazu eine neue Tabelle erstellt und jedem Ausgabefeld erneut ein Präfix vorangestellt, um die Tabelle anzugeben, aus der es stammt (das Präfix ist sehr wichtig, wie Sie sehen werden):

CREATE TABLE mcdon_addr_trct_and_blk AS
SELECT 
  a.*,
  b.pop90 AS blk_pop90, 
  b.white90 AS blk_white90, 
  b.black90 AS blk_black90, 
  b.asian90 AS blk_asian90, 
  b.amind90 AS blk_amind90, 
  b.other90 AS blk_other90, 
  b.hisp90 AS blk_hisp90
FROM 
  mcdon_addresses_wtract AS a,
  mo_blocks_2010 AS b
WHERE
  ST_Contains(b.wkb_geometry, a.wkb_geometry);

Natürlich pflegen Sie die Tabelle:

vacuum mcdon_addr_trct_and_blk;

Der Grund, warum ich jedem Ausgabefeld ein Präfix vorangestellt habe, war, dass wenn ich es nicht getan hätte, einige Felder dieselben Namen hätten und es unmöglich wäre, sie im Endprodukt voneinander zu unterscheiden (auch ... PostGREs haben sich möglicherweise auf halbem Weg darüber beschwert, aber da ich mich umbenannte, gab ich ihm nicht die chance). Betrachten Sie beispielsweise die folgenden beiden Felder aus beiden obigen Schritten. Sie können sehen, warum ich sie umbenannt habe ..

t.pop90 AS tr_pop90   -- would have been simply pop90
b.pop90 AS blk_pop90  -- also would have been pop90 ! 

Haben wir jetzt eine Adresse mit Traktaten und Blockdatensätzen? Haben wir immer noch die gleiche Anzahl von Punkten?

select count(*) from mcdon_addr_trct_and_blk;
-- 11848 (thumbs up!)

Ja, machen wir! Wenn Sie möchten, können Sie die erste von uns erstellte Tabelle löschen mcdon_addresses_wtract. Wir brauchen es nicht mehr für die Analyse.

Als letzte Aktion möchten Sie möglicherweise Ihre Daten aus PostGREs in ein ESRI-Shapefile exportieren, damit Sie sie mit anderen Programmen wie ArcGIS anzeigen können (natürlich kann QGIS die PostGIS-Daten ohne Probleme lesen). Wenn Sie interessiert sind, können Sie die Konvertierung mit ogr2ogr folgendermaßen durchführen:

ogr2ogr -f "ESRI Shapefile" "E:\path_to\addr_trct_blk.shp" PG:"host=127.0.0.1 user=youruser dbname=yourdb password=yourpass" "mcdon_addr_trct_and_blk"

Wenn Sie diesen Befehl ausführen, erhalten Sie wahrscheinlich folgende Warnungen:

Warnung 6: Normalisierter / gewaschener Feldname: 'tr_statefp10' bis 'tr_statefp'

Dies bedeutet nur, dass OGR diesen Feldnamen kürzen musste, da der Feldname in einem Shapefile nur so lang sein kann.

Dies ist natürlich nur eine von vielen Möglichkeiten, um diese Aufgabe zu erfüllen.


9

2
+1 Diese relativ undurchsichtige Site (wer würde zur FCC für Volkszählungsdaten gehen?) Scheint eine leistungsstarke, direkt anwendbare Lösung für das Problem zu bieten. Willkommen in unserer Community, Bob!
whuber

Diese fcc-Seite gab nicht die richtige Antwort, als ich sie mit den von der Volkszählung veröffentlichten Karten auf Blockebene verglich. Verwendet Lat / Long von Google Maps. census.gov/geo/maps-data/maps/block/2010/place/…
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.