7 votos

¿Dónde puedo obtener los datos de las relaciones de vecindad de los condados (EE.UU.)?

Necesito un gráfico en el que cada nodo sea un condado estadounidense y cada arista represente una frontera compartida entre condados. No me importa especialmente la posición absoluta o la forma de cada condado (aunque eso sería un plus).

¿Dónde puedo encontrar esa información (de forma gratuita)? ¿Cuerpo de Ingenieros del Ejército? ¿Geometría de los Estados Unidos?

Idealmente, podría obtener una lista csv algo así como

  • FL-Polk, FL-Lake
  • FL-Polk, FL-Orange
  • FL-Polk, FL-Osceola
  • etc. para cada condado, incluidas las fronteras de las esquinas, las fronteras a través del agua o las fronteras estatales

Soy programador, así que espero poder manejar cualquier formato de intercambio estándar. (Aunque eso podría ser sólo arrogancia). (No tengo ninguna aplicación GIS, sólo humildes scripts en perl y python).

4voto

Tim Howland Puntos 3650

La mayoría de las veces tiene razón. La sacarosa es un disacárido compuesto por glucosa y fructosa.

enter image description here

Es un material cristalino. Al calentar la sacarosa se produce una proceso térmico complejo que implica tanto la fusión como la descomposición. Dependiendo de la velocidad a la que se caliente, se observarán cosas diferentes. Básicamente, la sacarosa comenzará a descomponerse cuando empiece a fundirse. Si hay algo de agua presente durante el proceso de calentamiento, se producirá una reacción conocida como inversión de la sacarosa y ésta se descompondrá en sus componentes, una molécula de glucosa y otra de fructosa.

Sin embargo, si la sacarosa seca se calienta hasta su punto de fusión o descomposición, ocurren cosas más complejas. Inicialmente se detectan cantidades significativas de glucosa. El calentamiento continuado conduce a " caramelización ". La caramelización es un proceso de condensación en el que se elimina el agua de la sacarosa; a la pérdida inicial de agua le siguen la isomerización y la polimerización. Más de 4.000 productos se cree que se forman durante la caramelización. Cuando esta mezcla compleja se enfría, deja de ser sacarosa.

3voto

Ally Sutherland Puntos 858

ACTUALIZACIÓN : Se ha añadido un índice espacial para mejorar el rendimiento y unas breves instrucciones para utilizar este script en Windows.

#-------------------------------------------------------------------------------
#   This script will build an adjacency table in csv format representing
#   county polygons that "neighbor" each other. This script is intended
#   to illustrate the use of Python, OGR, Shapely, and Rtree.
#
#   County shapefile used in this example: http://cta.ornl.gov/transnet/scuov.zip
#
#   You will need Shapely, GDAL/OGR, and Rtree to run this. The easiest way for
#   Windows users to obtain these dependencies is to download the OSGeo4W
#   installer[1] and run an advanced install to retreive (located under Libs):
#
#       gdal-python (1.8.0)
#       libspatialindex (1.5.0-1, not 1.6.1)
#
#   From the OSGeo4W shell, install setuptools via ez_setup.py[2], and then run
#   these commands:
#
#       python -m easy_install shapely
#       python -m easy_install rtree
#
#   This script can then be run from the OSGeo4W shell.
#
#   [1] http://trac.osgeo.org/osgeo4w
#   [2] http://trac.osgeo.org/osgeo4w/wiki/TracPlugins
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import sys, cPickle
from rtree import Rtree
from osgeo import ogr
from shapely import wkb

class FastRtree(Rtree):
    def dumps(self, obj):
        return cPickle.dumps(obj, -1)

def generator_function(list):
    for i, obj in enumerate(list):
        yield (i, obj[0].bounds, obj)

def main():
    csv = r'C:\county_adjacency.csv' # Path to output csv, modify as needed
    shapefile = r'C:\scuo.shp' # Path to existing shapefile, modify as needed
    fipsindex = 3 # Field index for FIPS code
    statenameindex = 0 # Field index for state name
    countynameindex = 1 # Field index for county name

    driver = ogr.GetDriverByName('ESRI Shapefile')
    dataset = driver.Open(shapefile)

    if dataset is None:
        print 'Open failed.'
        sys.exit(1)

    lyr = dataset.GetLayerByName('scuo') # Modify as needed
    lyr.ResetReading()

    countylist = []

    for feat in lyr:
        geom = feat.GetGeometryRef()
        if geom is not None and (geom.GetGeometryType() == ogr.wkbPolygon or geom.GetGeometryType() == ogr.wkbMultiPolygon):
            countytuple = wkb.loads(geom.ExportToWkb()), \
                          feat.GetFieldAsString(fipsindex), \
                          feat.GetFieldAsString(countynameindex), \
                          feat.GetFieldAsString(statenameindex)
            countylist.append(countytuple)
        else:
            print 'Error reading polygon geometry for: ' + \
                  feat.GetFieldAsString(fipsindex) + ', ' + \
                  feat.GetFieldAsString(countynameindex) + ', ' + \
                  feat.GetFieldAsString(statenameindex)

    idx = FastRtree(generator_function(countylist))

    csvfile = open(csv, 'w')
    csvfile.write('\"fips1\",\"county1\",\"state1\",\"fips2\",\"county2\",\"state2\"' + '\n')
    for i in countylist:
        for j in list(idx.intersection(i[0].bounds, objects='raw')):
            try:
                if i[0].touches(j[0]):
                    csvfile.write('\"' + \
                                  i[1] + '\",\"' + \
                                  i[2] + '\",\"' + \
                                  i[3] + '\",\"' + \
                                  j[1] + '\",\"' + \
                                  j[2] + '\",\"' + \
                                  j[3] + '\"\n')
            except:
                print 'Failed to evaluate: ' + \
                      i[1] + ',' + \
                      i[2] + ',' + \
                      i[3] + \
                      ' with ' + \
                      j[1] + ',' + \
                      j[2] + ',' + \
                      j[3]

    csvfile.close()
    dataset = None

if __name__ == '__main__':
    main()

3voto

saint_groceon Puntos 2696

Ya que mencionas que eres programador, aquí tienes un código que funciona con arcgis 10. Actualización: Si no te apetece programar, he publicado un shapefile comprimido del gráfico aquí .

public void TestGetNeighbors()
{
    var fLayer = ArcMap.Document.FocusMap.get_Layer(0) as IFeatureLayer;
    var dict = GetNeighborsByName((ITopologyClass)fLayer.FeatureClass, "{0} {1}", "Name", "State_Name");
    foreach (KeyValuePair<string, List<string>> kvp in dict)
    {
        Debug.WriteLine(kvp.Key);
        foreach (string neighbor in kvp.Value)
            Debug.WriteLine("\t" + neighbor);
    }
}
private Dictionary<string, List<string>> GetNeighborsByName(ITopologyClass topoClass, string format, params object[] fldNames)
{
    var fc = topoClass as IFeatureClass;
    if (topoClass.Topology.Cache.BuildExtent == null || topoClass.Topology.Cache.BuildExtent.IsEmpty)
    {
        Debug.WriteLine("building ...");
        topoClass.Topology.Cache.Build(((IGeoDataset)fc).Extent, false);
    }

    // get neighbors by oid
    var oidDict = GetNeighborsByOid(topoClass);

    // use the full names to build the output dictionary
    var nameDict = GetFullNames(fc, format, fldNames);
    var outDict = new Dictionary<string, List<string>>();
    foreach (KeyValuePair<int, List<int>> kvp in oidDict)
    {
        var list = new List<string>();
        foreach (int oid in kvp.Value)
            list.Add(nameDict[oid]);
        outDict.Add(nameDict[kvp.Key], list);
    }
    return outDict;
}

private Dictionary<int, List<int>> GetNeighborsByOid(ITopologyClass topoClass)
{            
    var outDict = new Dictionary<int, List<int>>();
    IFeatureCursor fCur = ((IFeatureClass)topoClass).Search(null, false);
    try
    {
        IFeature feat = null;
        while ((feat = fCur.NextFeature()) != null)
        {
            var neighbors = GetNeighboringFeatureOids(topoClass.Topology.Cache,(IFeatureClass)topoClass , feat.OID);
            outDict.Add(feat.OID, neighbors);
        }
    }
    catch
    {
        throw;
    }
    finally
    {
        if(fCur != null)
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
    }
    return outDict;
}

private List<int> GetNeighboringFeatureOids(ITopologyGraph topoGraph, IFeatureClass fc, int oid)
{
    var outList = new List<int>();
    var enumEdge = topoGraph.GetParentEdges(fc, oid);
    for (int i = 0; i < enumEdge.Count; i++)
    {
        var edge = enumEdge.Next();
        outList.AddRange(GetParentOids(edge.get_LeftParents(true),fc));
        outList.AddRange(GetParentOids(edge.get_RightParents(true),fc));               
    }
    // handle the kitty-corner case
    var enumNode = topoGraph.GetParentNodes(fc, oid);
    for(int i=0; i<enumNode.Count;i++)
    {
        var node = enumNode.Next();
        var list = GetParentOids(node.Parents, fc);
        foreach (int neighborOid in list)
        {
            if (!outList.Contains(neighborOid))
                outList.Add(neighborOid); // kitty corner
        }
    }
    return Reduce(outList,oid);
}

private List<int> Reduce(List<int> inList, int omit)
{
    var outList = new List<int>();
    foreach (int i in inList)
    {
        if (!(outList.Contains(i) || omit == i))
            outList.Add(i);
    }
    return outList;
}

private List<int> GetParentOids(IEnumTopologyParent enumParent, IFeatureClass fc)
{
    var outList = new List<int>();
    for (int i = 0; i < enumParent.Count; i++)
    {
        var parent = enumParent.Next();
        if (parent.m_pFC == fc)
            outList.Add(parent.m_FID);
    }
    return outList;
}

private Dictionary<int, string> GetFullNames(IFeatureClass fc, string format, params object[] fldNames)
{
    var fldList = GetFieldIndexes(fc, fldNames);
    var outDict = new Dictionary<int, string>();
    IFeatureCursor fCur = fc.Search(null, false);
    IFeature feat = null;
    try
    {
        while ((feat = fCur.NextFeature()) != null)
        {
            var valList = new List<string>();
            foreach (int idx in fldList)
            {
                string val = feat.get_Value(idx) is DBNull ? "" : feat.get_Value(idx).ToString();
                valList.Add(val);
            }
            outDict.Add(feat.OID, String.Format(format, valList.ToArray()));
        }
    }
    catch
    {
        throw;
    }
    finally
    {
        if (fCur != null)
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
    }
    return outDict;
}

private static List<int> GetFieldIndexes(IFeatureClass fc, object[] fldNames)
{
    var fldList = new List<int>();
    foreach (string fldName in fldNames)
    {
        int idx = fc.FindField(fldName);
        if (idx == -1)
            throw new Exception(string.Format("field {0} not found on {1}", fldName, fc.AliasName));
        fldList.Add(idx);
    }
    return fldList;
}

Produce una salida como esta:

Yukon-Koyukuk Alaska
    North Slope Alaska
    Northwest Arctic Alaska
    Southeast Fairbanks Alaska
    Nome Alaska
    Fairbanks North Star Alaska
    Denali Alaska
    Wade Hampton Alaska
    Matanuska-Susitna Alaska
    Bethel Alaska
Southeast Fairbanks Alaska
    Yukon-Koyukuk Alaska
    Fairbanks North Star Alaska
    Denali Alaska
    Matanuska-Susitna Alaska
    Valdez-Cordova Alaska ...

1voto

Sunil Rana Puntos 9

La Oficina del Censo de Estados Unidos publica toneladas de mapas espaciales. Uno de ellos que resulta interesante es el de "Condados y equivalentes".

Pueden descargarse aquí:
http://www.census.gov/cgi-bin/geo/shapefiles2010/main

Una vez que tenga eso, hay un importador de shapefile para SQL Server aquí:
http://beyondrelational.com/blogs/jason/archive/2010/09/04/import-shapefiles-into-sql-server-and-aggregate-spatial-data-geometry.aspx

Una vez en el servidor SQL, puedes ejecutar una consulta de "intersección" (que dice que los límites de los condados deben compartir al menos 1 punto). Algo así:

SELECT c1.name, c2.name FROM
 county c1, county c2 WHERE c1.geog.STIntersects(c2.geog) AND c1.id < c2.id

0voto

Ronnie Overby Puntos 246

Podrías utilizar la API de geoplaneta de Yahoo

http://where.yahooapis.com/v1/place/12587851/neighbors?appid=[yourappidhere]

donde 12587851 ist Polk, FL (Condado)

  • consulte la documentación en Referencia de la API de geoplanet

  • una representación de la misma con explorador de geoplanetas

  • todos los condados de un estado de EE.UU. pueden ser recuperados por

     http://where.yahooapis.com/v1/counties/CA?appid=[yourappidhere]

    donde CA se sustituye por el código del estado (por ejemplo, California)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X