Как извлечь географические данные с карты открытых улиц или карты Google

StackOverflow https://stackoverflow.com/questions/2643199

Вопрос

Мне нужно извлечь все названия города из определенной страны, используя карту OpenStreet или Google Maps. Есть ли API?

Или есть ли другой способ получить этот мир географические данные?

Это было полезно?

Решение

Вы должны определенно оформить заказ GeOnames. У них есть весь мир в стандартизированной базе данных. Ты сможешь загрузить или использовать их API..

Я загружаю базу данных US и использую разъем, который я создал в C #, чтобы вставить государства, города, города и почтовые индикаторы в моей базе данных.

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

}

Есть также карты открытых улиц, которые вы можете скачать или использовать их API..

Я не предлагаю New API Yahoo, которые они режут продукты слева и справа, и вы никогда не знаете, как долго это будет вокруг. Также вы не можете скачать целую дамп в настоящее время.

Другие советы

29 января 2013 г. Обновление: Я создал набор данных CSV всех городов и населенных пунктов в мире, а также центроидным центром широты / долготы и помещен в общественное достояние. Я объединил данные с сервера USGS GNIS для США, а также сервера NGA GNS для всех других стран. Ниже приведена метаданные для макета файлов CSV и ссылка на набор данных:

http://www.opngeoCode.org/download.php1cities.

Столбец 1: ISO 3166-1 код страны-2.
Колонка 2: США FIPS 5-2 1-го уровня Административный код дивизии (например, штата / провинция).
Столбец 3: Описание функции NGA GNS (DSG).
Колонка 4: NGA GNS Уникальный идентификатор функции (UFI).
Столбец 5: код ALPHA-2/3 ISO 639-1 для языка, соответствующего имени функции.
Столбец 6: языковой скрипт (например, латинской, арабский, китайский, и т. Д.), Соответствует названию функции.
Столбец 7: имя функции.
Столбец 8: широта координаты зоны центроида.
Колонка 9: Долготу Координата зоны центроида.


Я посмотрел на решение от Jonperl. Это может использовать некоторые комментарии. Во-первых, я считаю, что Geonames.org получает данные города США с сервера USGS GNIS. Можно напрямую можно получить файл загрузки из них.

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

Несколько очков, кто-то должен знать: ADM1 стоит для административного подразделения первого уровня. Для США это 50 государств, район Колумбия, 5 американских территорий и 4 свободно ассоциированные государства.

ADM2 стоит для административного подразделения второго уровня. Для США это границы, районы и переписи, предназначенные для Аляски, прихожами для Луизианы, муниципалионы для Пуэрто-Рико, острова для Виргинских островов, Маршалловы острова, незначительные отдаленные острова, районы для американских самоа и муниципалитетов и муниципалитетов для островов в Северных Марианах. Отказ

PPL насленны местами. Я не уверен, как GeOnames.org сортирует их, но эта категория включает в себя с городами: крупные подразделения, неиспортированные районы и большие прицепы парки. Тип также включает некоторые исторические места.

Я могу ответить много этих вопросов. Я являюсь частью общественного доменного геопространственной команды в OpenGeCode.org

Андрей

Скачать данные из http://www.geonames.org/

Я не знаю, ограничиваете ли вы карты Google или карту OpenStreet, но вы можете найти взгляда на WOOEID Yahoo

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

У меня была игра с этим, и это чрезвычайно мощно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top