2010-04-15 16 views

Respuesta

5

Definitivamente deberías consultar GeoNames. Tienen todo el mundo en una base de datos estandarizada. Puede download it o usar su API.

Descargo la base de datos de EE. UU. Y uso un conector que creé en C# para insertar estados, ciudades, ciudades y códigos postales en mi base de datos.

public static class GeoNamesConnector 
{ 
    #region GeoName Constants 
    private static readonly string GeoNamesPath = HttpContext.Current.Server.MapPath("~/App_Data/GeoNames/US.txt"); 
    const int GeoNameIdColumn = 0; 
    const int NameColumn = 1; 
    const int LatitudeColumn = 4; 
    const int LongitudeColumn = 5; 
    const int FeatureCodeColumn = 7; 
    const int CountryCodeColumn = 8; 
    const int Admin1CodeColumn = 10; 
    const int Admin2CodeColumn = 11; 
    #endregion 

    #region AlternateName Constants 
    private static readonly string AlternateNamesPath = HttpContext.Current.Server.MapPath("~/App_Data/GeoNames/alternateNames.txt"); 
    const int AlternateNameIdColumn = 0; 
    const int AltNameGeoNameIdColumn = 1; 
    const int IsoLanguageColumn = 2; 
    const int AlternateNameColumn = 3; 
    #endregion 

    public static void AddAllEntities(GeoNamesEntities entities) 
    { 
     //Remember to turn off Intellitrace 
     Stopwatch stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     var geoNamesSortedList = AddGeoNames(entities); 
     Trace.WriteLine(String.Format("Added GeoNames: {0}", stopwatch.Elapsed)); 
     stopwatch.Restart(); 

     SetupGeoNameChildRelationships(geoNamesSortedList, entities); 
     Trace.WriteLine(String.Format("Setup GeoName parent/child relationships: {0}", stopwatch.Elapsed)); 
     stopwatch.Restart(); 

     AddPostalCodeAlternateNames(geoNamesSortedList, entities); 
     Trace.WriteLine(String.Format("Added postal codes and relationships with parent GeoNames: {0}", stopwatch.Elapsed)); 
    } 

    private static SortedList<int, GeoName> AddGeoNames(GeoNamesEntities entities) 
    { 
     var lineReader = File.ReadLines(GeoNamesPath); 
     var geoNames = from line in lineReader.AsParallel() 
         let fields = line.Split(new char[] { '\t' }) 
         let fieldCount = fields.Length 
         where fieldCount >= 9 
         let featureCode = fields[FeatureCodeColumn] 
         where featureCode == "ADM1" || featureCode == "ADM2" || featureCode == "PPL" 
         let name = fields[NameColumn] 
         let id = string.IsNullOrEmpty(fields[GeoNameIdColumn]) ? 0 : int.Parse(fields[GeoNameIdColumn]) 
         orderby id 
         select new GeoName 
         { 
          Id = Guid.NewGuid(), 
          GeoNameId = id, 
          Name = fields[NameColumn], 
          Latitude = string.IsNullOrEmpty(fields[LatitudeColumn]) ? 0 : Convert.ToDecimal(fields[LatitudeColumn]), 
          Longitude = string.IsNullOrEmpty(fields[LongitudeColumn]) ? 0 : Convert.ToDecimal(fields[LongitudeColumn]), 
          FeatureCode = featureCode, 
          CountryCode = fields[CountryCodeColumn], 
          Admin1Code = fieldCount < 11 ? "" : fields[Admin1CodeColumn], 
          Admin2Code = fieldCount < 12 ? "" : fields[Admin2CodeColumn] 
         }; 
     var sortedList = new SortedList<int, GeoName>(); 
     int i = 1; 
     foreach (var geoname in geoNames) 
     { 
      sortedList.Add(geoname.GeoNameId, geoname); 
      entities.GeographicAreas.AddObject(geoname); 
      if (i++ % 20000 == 0) 
       entities.SaveChanges(); 
     } 
     entities.SaveChanges(); 
     return sortedList; 
    } 

    private static void SetupGeoNameChildRelationships(SortedList<int, GeoName> geoNamesSortedList, GeoNamesEntities entities) 
    { 
     foreach (var geoName in geoNamesSortedList.Where(g => g.Value.FeatureCode == "ADM2" || g.Value.FeatureCode == "ADM1")) 
     { 
      //Setup parent child relationship 
      IEnumerable<KeyValuePair<int, GeoName>> children = null; 
      switch (geoName.Value.FeatureCode) 
      { 
       case "ADM1": 
        children = 
         geoNamesSortedList.Where(
          g => 
          g.Value.FeatureCode == "ADM2" && 
          g.Value.Admin1Code == geoName.Value.Admin1Code); 
        break; 
       case "ADM2": 
        children = 
         geoNamesSortedList.Where(
          g => 
          g.Value.FeatureCode == "PPL" && 
          g.Value.Admin1Code == geoName.Value.Admin1Code && 
          g.Value.Admin2Code == geoName.Value.Admin2Code); 
        break; 
      } 
      if (children != null) 
      { 
       foreach (var child in children) 
        geoName.Value.Children.Add(child.Value); 
      } 
      entities.SaveChanges(); 
     } 
    } 

    private static void AddPostalCodeAlternateNames(SortedList<int, GeoName> geoNamesSortedList, GeoNamesEntities entities) 
    { 
     var lineReader = File.ReadLines(AlternateNamesPath); 
     var alternativeNames = from line in lineReader.AsParallel() 
           let fields = line.Split(new char[] { '\t' }) 
           let fieldCount = fields.Length 
           where fieldCount >= 4 && fields[IsoLanguageColumn] == "post" 
           let geoNameId = int.Parse(fields[AltNameGeoNameIdColumn]) 
           orderby geoNameId 
           select new AlternateName 
           { 
            Id = Guid.NewGuid(), 
            AlternateNameId = int.Parse(fields[AlternateNameIdColumn]), 
            ParentGeoNameId = geoNameId, 
            Name = fields[AlternateNameColumn], 
            IsoLanguage = fields[IsoLanguageColumn] 
           }; 
     //Iterate through to convert from lazy (AsParallel) so it is ready for use 
     foreach (var alternateName in alternativeNames) 
     { 
      int key = alternateName.ParentGeoNameId; 
      if (geoNamesSortedList.ContainsKey(key)) 
      { 
       entities.GeographicAreas.AddObject(alternateName); 
       alternateName.Parent = geoNamesSortedList[key]; 
      } 
     } 
     entities.SaveChanges(); 
    } 

} 

También existe Open Street Maps que puede download o utilizar sus API.

No sugiero la nueva API de Yahoo, están recortando productos a diestra y siniestra y nunca se sabe cuánto tiempo durará. Además, no puedes descargar un vertedero completo actualmente.

+0

Su agradable. .. gracias jonperl .. :) – RameshVel

1

no sé si tiene restringido a los mapas de Google o mapa openstreet pero podría encontrar echar un vistazo a WOEID de Yahoo interesante.

http://developer.yahoo.com/geo/geoplanet/

he tenido un juego un poco con esto y es muy potente.

+0

gracias azp74 .. que parece muy prometedor .. :) – RameshVel

3

29 de enero de 2013 Actualización: He creado un conjunto de datos CSV de todas las ciudades y lugares poblados del mundo, junto con un centroide de área de latitud/longitud, y se coloca en el dominio público. Combiné datos del servidor GNIS de USGS para los EE. UU. Y el servidor NGA GNS para todos los demás países. A continuación se muestra los metadatos de la estructura del archivo CSV y enlace a la base de datos:

http://www.opengeocode.org/download.php#cities

Columna 1: ISO 3166-1 alfa-2 del país.
Columna 2: código de división administrativa de primer nivel FIPS 5-2 de EE. UU. (Por ejemplo, estado/provincia).
Columna 3: NGA GNS Feature Description (DSG) code.
Columna 4: NGA Identificador único de funciones GNS (UFI).
Columna 5: Código ISO 639-1 alpha-2/3 para el idioma correspondiente al nombre de la función.
Columna 6: script de idioma (por ejemplo, latín, árabe, chino, etc.) correspondiente al nombre de la función.
Columna 7: nombre del elemento.
Columna 8: coordenada de latitud del área centroide.
Columna 9: Coordenada de longitud del centroide del área.


Miré la solución de Jonperl. Podría usar algunos comentarios. En primer lugar, creo que geonames.org obtiene los datos de la ciudad de EE. UU. Del servidor GNIS de USGS. Uno puede obtener directamente un archivo de descarga de ellos.

http://geonames.usgs.gov/domestic/download_data.htm

algunos puntos alguien debe saber: ADM1 significa división administrativa de primer nivel.Para los EE. UU., Estos son los 50 estados, el Distrito de Columbia, los 5 territorios de EE. UU. Y los 4 estados de libre asociación.

ADM2 significa división administrativa de segundo nivel. Para los EE. UU., Estos son condados, distritos y áreas designadas para el censo de Alaska, parroquias de Louisiana, municipios de Puerto Rico, islas de las Islas Vírgenes, Islas Marshall, islas menores alejadas de los EE. UU., Distritos de Samoa Americana y municipios de las Islas Marianas Norteñas. .

PPL son lugares poblados. No estoy seguro de cómo geonames.org clasifica estos, pero esta categoría incluye ciudades: grandes subdivisiones, áreas no unidas y grandes parques de casas rodantes. Thney también incluye algunos lugares históricos.

Puedo responder muchas de estas preguntas. Soy parte de un equipo geoespacial dominio público en OpenGeoCode.Org

Andrew

+0

gracias Andrew por la información ... acabo de revisar el sitio OpenGeoCode.Org ... ¿OpenGeoCode solo se ocupa de datos de América del Norte o en el mundo ..? estoy interesado en una solución que cubra datos geográficos de todo el mundo .... – RameshVel

+0

OpenGeoCode proporcionará geodatos de alto nivel en todo el mundo. Pero por ahora, solo planeamos hacer geodatos detallados para América del Norte. Estamos enfocados en la alta precisión de los datos, por eso el objetivo más restringido. Hay más datos en la tubería, pero todo pasa por un proceso de revisión/ajuste. –

Cuestiones relacionadas