Я розробляю програму, яка обчислює відстань між містами, використовуючи їх відповідні значення довготи та широти.
Але проблема полягає в тому, де отримати вичерпний перелік значень широти та довготи цих міст?
Я розробляю програму, яка обчислює відстань між містами, використовуючи їх відповідні значення довготи та широти.
Але проблема полягає в тому, де отримати вичерпний перелік значень широти та довготи цих міст?
Відповіді:
Наскільки я знаю, GeoLite City в Legacy-завантажених базах даних GeoLite - це майже стандарт.
Не забувайте про набір даних про геоімена :
Географічна база даних GeoNames охоплює всі країни та містить понад вісім мільйонів топонімів, які можна завантажити безкоштовно.
http://download.geonames.org/export/dump/
Природні населені місця Землі можуть бути ще одним варіантом.
all admin-0 and many admin-1 capitals, major cities and towns, plus a sampling of smaller towns in sparsely inhabited regions
. Значення латлон можна знайти у вигляді двох стовпців всередині DBF
файлу.
POP_MAX,POP_MIN,POP_OTHER = "158000","113700","107890"
для мого міста, яке насправді в епоху СРСР становило максимум 173000.
Ви також можете отримати дані з OpenStreetMap (використовуючи, наприклад, їх API, як описано тут ), або просто з Вікіпедії. Більшість сторінок Вікіпедії для міст мають координати міста.
Звичайно, для цього знадобиться трохи сценаріїв і, можливо, список міст, які ви хочете.
Використовуйте OpenStreetMap, доступ до Інтернету, інструмент wget та фільтр XPath, як XML :: XPath . Прохання має бути зібрано в BBoxes 2х2 градуси. Ось приклад для 12 градусів на захід до 14 градусів на схід і 52 градуси на південь і 54 градуси на північ. Берлін всередині .. з великою кількістю інфо. Для менших одиниць використовуйте місце = місто. Формат вхідного файлу - XML.
wget -O osm-city-12-52-14-54.xml "http://open.mapquestapi.com/xapi/api/0.6/node[place=city][bbox=12,52,14,54]"
wget -O osm-town-12-52-14-54.xml "http://open.mapquestapi.com/xapi/api/0.6/node[place=town][bbox=12,52,14,54]"
<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="Osmosis SNAPSHOT-r26564">
<node id="21484051" version="7" timestamp="2010-07-13T20:11:08Z" uid="15720" user="J budissin" changeset="5211741" lat="52.2994511" lon="13.6244389">
<tag k="openGeoDB:auto_update" v="population,is_in"/>
<tag k="openGeoDB:loc_id" v="19549"/>
<tag k="openGeoDB:is_in_loc_id" v="294"/>
<tag k="openGeoDB:name" v="Königs Wusterhausen"/>
<tag k="openGeoDB:is_in" v="Dahme-Spreewald,Brandenburg,Bundesrepublik Deutschland,Europe"/>
<tag k="openGeoDB:layer" v="6"/>
<tag k="openGeoDB:version" v="0.2.6.11 / 2007-12-04 / http://fa-technik.adfc.de/code/opengeodb/dump/"/>
<tag k="openGeoDB:telephone_area_code" v="03375"/>
<tag k="openGeoDB:population" v="32785"/>
<tag k="is_in" v="Dahme-Spreewald,Brandenburg,Bundesrepublik Deutschland,Europe"/>
<tag k="openGeoDB:community_identification_number" v="12061260"/>
<tag k="openGeoDB:license_plate_code" v="LDS"/>
<tag k="openGeoDB:sort_name" v="KOENIGS WUSTERHAUSEN"/>
<tag k="openGeoDB:type" v="Stadt"/>
<tag k="openGeoDB:postal_codes" v="15711,15831"/>
<tag k="name:hsb" v="Parsk (Königs Wusterhausen)"/>
<tag k="name" v="Königs Wusterhausen"/>
<tag k="opengeodb:lat" v="52.296999"/>
<tag k="opengeodb:lon" v="13.6297229"/>
<tag k="place" v="town"/>
<tag k="population" v="33370"/>
</node>
...
Простий сценарій комбайна Perl:
#!/usr/bin/perl -w
# --------------------------------------------------------
# Simple OSM Harvester
# --------------------------------------------------------
use strict;
use XML::XPath;
use XML::XPath::XMLParser;
# Use UFT 8
binmode(STDOUT, ":utf8");
# --------------------------------------------------------
# Parameter @todo put params into commandline arguments
# --------------------------------------------------------
# while ($cmd = shift) {
# $level = shift if $cmd =~ /level/;
# $east = shift if $cmd =~ /east/;
# ....
# }
# --------------------------------------------------------
my $level="town";
my $east=14;
my $west=12;
my $north=54;
my $south=52;
# --------------------------------------------------------
# OS Call wget
# --------------------------------------------------------
my @call =`wget -O osm-town-$west-$south-$east-$north.xml "http://open.mapquestapi.com/xapi/api/0.6/node[place=$level][bbox=$west,$south,$east,$north]"`;
# --------------------------------------------------------
# Parse the stuff
# --------------------------------------------------------
my $xp = XML::XPath->new(filename => "osm-town-$west-$south-$east-$north.xml");
my $nodes = $xp->find('/osm/node'); # find all paragraphs
for my $node ($nodes->get_nodelist) {
# print $n, "\n";
my $lat = $xp->find('./@lat', $node);
my $lon = $xp->find('./@lon', $node);
my $name = $xp->find('./tag[@k=\'name\']/@v', $node);
my $pop = $xp->find('./tag[@k=\'population\']/@v', $node);
print "name=$name\tlogitude=$lon\tlatitude=$lat\tpopulation=$pop\n";
}
# --------------------------------------------------------
# EOF
# --------------------------------------------------------
Згенерований вихід (вибачте німецьку LANG від wget)
./osm.pl
Warnung: Joker-Zeichen werden bei HTTP nicht unterstützt.
--2014-02-04 01:13:23-- http://open.mapquestapi.com/xapi/api/0.6/node[place=town][bbox=12,52,14,54]
Auflösen des Hostnamen »open.mapquestapi.com (open.mapquestapi.com)«... 205.188.201.176
Verbindungsaufbau zu open.mapquestapi.com (open.mapquestapi.com)|205.188.201.176|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: nicht spezifiziert [text/xml]
In »»osm-town-12-52-14-54.xml«« speichern.
[ <=> ] 128.148 242K/s in 0,5s
2014-02-04 01:13:30 (242 KB/s) - »»osm-town-12-52-14-54.xml«« gespeichert [128148]
name=Königs Wusterhausen logitude=13.6244389 latitude=52.2994511 population=q33370
name=Teterow logitude=12.5753569 latitude=53.7709505 population=9647
name=Neukalen logitude=12.7905515 latitude=53.822817 population=2304
name=Premnitz logitude=12.3384178 latitude=52.5310487 population=9671
name=Havelberg logitude=12.0733335 latitude=52.8234367 population=7400
name=Teltow logitude=13.2644532 latitude=52.4016457 population=19541
Ось ще один варіант для Глобальних міст: версія GRUMP 1 має вільний шар точок поселення з атрибутами, такими як розмір населення.
http://sedac.ciesin.columbia.edu/data/set/grump-v1-settlement-points
Список цитат я завантажив з http://www.zuzemo.com/world-cities-and-administrative-division-database-german-edition , вони мають інші мови німецьку, італійську, іспанську ...
Ви можете спробувати це з геоімен, яке абсолютно безкоштовно ..
В Інтернеті також є багато платних баз даних, таких як www.worldcitiesdatabase.com або geodatasource.com
Ви також можете використовувати дані відкритих вулиць, але вам потрібно розібратися в системі тегів для витягу даних.
Ще одна безкоштовна база даних, що стосується 30 символів .. https://www.maxmind.com/en/worldcities
Я використовую геодані від www.ip2location.com