openstreet マップまたは Google マップを使用して、特定の国からすべての都市名を取得する必要があります。利用可能なAPIはありますか?
または、この世界の地理データを取得する他の方法はありますか?
openstreet マップまたは Google マップを使用して、特定の国からすべての都市名を取得する必要があります。利用可能なAPIはありますか?
または、この世界の地理データを取得する他の方法はありますか?
GeoNames をチェックアウトする必要があります。彼らは標準化されたデータベースに全世界を持っています。ダウンロードするか、APIを使用できます。
米国のデータベースをダウンロードし、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をダウンロードまたは使用できる Open Street Maps もあります。
私は、Yahoo の新しい API が製品を左右に切り捨てていることを示唆していません。それがいつまで続くかはわかりません。また、現在、ダンプ全体をダウンロードすることはできません。
2013 年 1 月 29 日更新: 世界のすべての都市と人口の多い場所の CSV データセットを作成し、緯度/経度の重心とともに、パブリック ドメインに配置しました。米国については USGS GNIS サーバーからのデータを、その他すべての国については NGA GNS サーバーからのデータを組み合わせました。以下は、CSV ファイル レイアウトのメタデータとデータセットへのリンクです。
http://www.opengeocode.org/download.php#cities
列 1: ISO 3166-1 alpha-2 国コード。
列 2: US FIPS 5-2 第 1 レベルの行政区分コード (例: 州/県)。
列 3: NGA GNS 機能記述 (DSG) コード。
列 4: NGA GNS Unique Feature Identifier (UFI)。
列 5: 機能名に対応する言語の ISO 639-1 alpha-2/3 コード。
列 6: 機能名に対応する言語スクリプト (ラテン語、アラビア語、中国語など)。
列 7: 機能名。
列 8: 地域重心の緯度座標。
列 9: 地域重心の経度座標。
Jonperlのソリューションを見ました。いくつかのコメントを使用できます。まず、geonames.org は USGS GNIS サーバーから米国の都市データを取得していると思います。それらからダウンロードファイルを直接取得できます。
http://geonames.usgs.gov/domestic/download_data.htm
知っておくべきいくつかのポイント: ADM1 は、第 1 レベルの行政区分を表します。米国の場合、これらは 50 の州、コロンビア特別区、5 つの米国準州、および自由に関連付けられた 4 つの州です。
ADM2 は、第 2 レベルの行政区分を表します。米国の場合、これらはアラスカの郡、自治区、国勢調査指定地域、ルイジアナ州の教区、プエルトリコの市区町村、バージン諸島、マーシャル諸島、米国領有小離島の島々、アメリカ領サモアの地区、北マリアナ諸島の市町村です。 .
PPLは人口の多い場所です。geonames.org がこれらをどのように分類しているかはわかりませんが、このカテゴリには都市が含まれます: 大規模な分譲地、非法人地域、大規模なトレーラー パーク。Thneyには、いくつかの歴史的な場所も含まれています。
私はこれらの質問の多くに答えることができます. 私は、OpenGeoCode.Org のパブリック ドメインの地理空間チームの一員です。
アンドリュー
http://www.geonames.org/からデータをダウンロードします。
Google マップや OpenStreet マップに制限されているかどうかはわかりませんが、Yahoo の woeid を見てみると面白いかもしれません。
http://developer.yahoo.com/geo/geoplanet/
私はこれをいじってみましたが、非常に強力です。