2010-04-15 30 views

Trả lời

5

Bạn chắc chắn nên kiểm tra GeoNames. Họ có toàn bộ thế giới trong một cơ sở dữ liệu tiêu chuẩn hóa. Bạn có thể download it hoặc sử dụng API của họ.

Tôi tải xuống cơ sở dữ liệu của Hoa Kỳ và sử dụng trình kết nối tôi đã tạo trong C# để chèn các Quốc gia, Thành phố, Thị trấn và Mã Zip vào cơ sở dữ liệu của mình.

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(); 
    } 

} 

Ngoài ra còn có mở đường Maps mà bạn có thể download hoặc sử dụng API của họ.

Tôi không đề xuất API mới của Yahoo, họ đang cắt giảm sản phẩm sang trái và phải và bạn không bao giờ biết được nó sẽ tồn tại bao lâu. Ngoài ra, bạn không thể tải xuống toàn bộ bãi chứa hiện tại.

+0

đẹp của nó. .. cảm ơn jonperl .. :) – RameshVel

1

Tôi không biết nếu bạn đang bị hạn chế để google bản đồ hoặc bản đồ openstreet nhưng bạn có thể tìm lấy một cái nhìn tại woeid Yahoo thú vị.

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

Tôi đã chơi với điều này và cực kỳ mạnh mẽ.

+0

nhờ azp74 .. trông rất hứa hẹn .. :) – RameshVel

3

Ngày 29 tháng 1 năm 2013 Cập nhật: Tôi đã tạo tập dữ liệu CSV của tất cả các thành phố và các địa điểm đông dân trên thế giới, cùng với khu vực vĩ ​​độ/kinh độ và được đặt vào miền công cộng. Tôi kết hợp dữ liệu từ máy chủ USGS GNIS cho Hoa Kỳ và máy chủ NGA GNS cho tất cả các quốc gia khác. Dưới đây là các siêu dữ liệu cho việc bố trí tập tin CSV và liên kết với các tập dữ liệu:

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

Cột 1: ISO 3166-1 alpha-2 mã quốc gia.
Cột 2: US FIPS 5-2 Mã phân chia hành chính cấp 1 (ví dụ: tiểu bang/tỉnh).
Cột 3: Mã mô tả tính năng NGA GNS (DSG).
Cột 4: NGA GNS Unique Identifier Identifier (UFI).
Cột 5: Mã ISO 639-1 alpha-2/3 cho ngôn ngữ tương ứng với tên đối tượng địa lý.
Cột 6: Tập lệnh ngôn ngữ (ví dụ: latin, arabic, chinese, v.v.) tương ứng với tên đối tượng địa lý.
Cột 7: Tên tính năng.
Cột 8: Tọa độ Latitude của vùng trọng tâm.
Cột 9: Tọa độ kinh độ của vùng trọng tâm.


Tôi đã xem giải pháp từ Jonperl. Nó có thể sử dụng một số ý kiến. Đầu tiên, tôi tin rằng geonames.org lấy dữ liệu thành phố của Hoa Kỳ từ máy chủ USGS GNIS. Người ta có thể trực tiếp nhận được một tập tin tải về từ họ.

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

Một vài điểm một ai đó nên biết: ADM1 là viết tắt của đơn vị hành chính cấp độ đầu tiên.Đối với Hoa Kỳ, đây là 50 tiểu bang, Quận Columbia, 5 lãnh thổ của Hoa Kỳ và 4 bang liên quan tự do.

ADM2 là viết tắt của bộ phận hành chính cấp hai. Đối với Hoa Kỳ, đây là các quận, quận và khu vực được chỉ định cho Alaska, các giáo xứ cho Louisiana, các đô thị cho Puerto Rico, các đảo của Quần đảo Virgin, Quần đảo Marshall, Quần đảo nhỏ xa xôi của Hoa Kỳ, các huyện thuộc Samoa thuộc Hoa Kỳ và các đô thị của Quần đảo Nothern Mariana .

PPL là các địa điểm đông dân cư. Tôi không chắc chắn cách geonames.org sắp xếp các loại này, nhưng danh mục này bao gồm các thành phố: các phân khu lớn, các khu vực chưa được thống nhất và các công viên trailer lớn. Thney cũng bao gồm một số địa điểm lịch sử.

Tôi có thể trả lời nhiều câu hỏi này. Tôi là một phần của một nhóm nghiên cứu không gian địa lý phạm vi công cộng tại OpenGeoCode.Org

Andrew

+0

cảm ơn Andrew cho cái nhìn sâu sắc .. tôi chỉ cần kiểm tra các trang web OpenGeoCode.Org ... là OpenGeoCode chỉ đề với Bắc Mỹ dữ liệu hoặc trên toàn thế giới ..? đang quan tâm đến giải pháp bao gồm dữ liệu địa lý trên toàn thế giới .... – RameshVel

+0

OpenGeoCode sẽ cung cấp một số geodata cấp cao trên toàn thế giới. Nhưng hiện tại, chúng tôi chỉ có kế hoạch làm geodata chi tiết cho Bắc Mỹ. Chúng tôi tập trung vào độ chính xác cao của dữ liệu, vì vậy đó là lý do tại sao mục tiêu hẹp hơn. Có nhiều dữ liệu hơn trong đường dẫn, nhưng tất cả đều đi qua quá trình xem xét/điều chỉnh. –

Các vấn đề liên quan