diff --git a/integration-test/1999-keep-n-gridded.py b/integration-test/1999-keep-n-gridded.py new file mode 100644 index 000000000..db5298b33 --- /dev/null +++ b/integration-test/1999-keep-n-gridded.py @@ -0,0 +1,35 @@ +# -*- encoding: utf-8 -*- +from shapely.wkt import loads as wkt_loads +import dsl +from . import FixtureTest + + +class KeepNGriddedPlaces(FixtureTest): + + def setUp(self): + super(KeepNGriddedPlaces, self).setUp() + ways = [dsl.way(0, wkt_loads('POINT (139.688014 35.62125)'), {'id': u'57542483', 'name': u'目黒区', 'name:en': u'Meguro', 'place': u'city', 'population': u'282785', 'wikidata': u'Q233903'}), dsl.way(1, wkt_loads('POINT (139.645796 35.86164)'), {'capital': u'4', 'id': u'243993095', 'name': u'さいたま市', 'name:en': u'Saitama', 'place': u'city', 'population': u'1182115', 'wikidata': u'Q134635'}), dsl.way(2, wkt_loads('POINT (139.327644 35.85569)'), {'id': u'247962196', 'name': u'飯能市', 'name:en': u'Hanno', 'place': u'city', 'population': u'79931', 'wikidata': u'Q850472'}), dsl.way(3, wkt_loads('POINT (139.085761 35.991451)'), {'id': u'248008276', 'name': u'秩父市', 'name:en': u'Chichibu', 'place': u'city', 'population': u'63555', 'wikidata': u'Q647079'}), dsl.way(4, wkt_loads('POINT (139.759455 35.682839)'), {'admin_leve': u'2', 'capital': u'yes', 'id': u'265018692', 'name': u'東京都 Tokyo', 'name:en': u'Tokyo', 'place': u'city', 'population': u'13613660', 'wikidata': u'Q1490'}), dsl.way(5, wkt_loads('POINT (139.388614 36.147247)'), {'id': u'301641122', 'name': u'熊谷市', 'name:en': u'Kumagaya', 'place': u'city', 'population': u'198742', 'wikidata': u'Q41106'}), dsl.way(6, wkt_loads('POINT (139.4559 36.138605)'), {'id': u'302348601', 'name': u'行田市', 'name:en': u'Gyoda', 'place': u'city', 'population': u'80562', 'wikidata': u'Q860659'}), dsl.way(7, wkt_loads('POINT (139.534425 36.212126)'), {'id': u'302355166', 'name': u'明和町', 'name:en': u'Meiwa', 'place': u'town', 'population': u'11044', 'wikidata': u'Q1203274'}), dsl.way(8, wkt_loads('POINT (137.925887 34.750052)'), {'id': u'420453539', 'name': u'袋井市', 'name:en': u'Fukuroi', 'place': u'city', 'population': u'86532', 'wikidata': u'Q821337'}), dsl.way(9, wkt_loads('POINT (138.018733 34.793469)'), {'id': u'420453612', 'name': u'掛川市', 'name:en': u'Kakegawa', 'place': u'city', 'population': u'114602', 'wikidata': u'Q823988'}), dsl.way(10, wkt_loads('POINT (137.935383 34.863955)'), {'id': u'420453634', 'name': u'森町', 'name:en': u'Mori', 'place': u'town', 'population': u'18528', 'wikidata': u'Q1345571'}), dsl.way(11, wkt_loads('POINT (137.851285 34.706481)'), {'id': u'420453696', 'name': u'磐田市', 'name:en': u'Iwata', 'place': u'city', 'population': u'166426', 'wikidata': u'Q386651'}), dsl.way(12, wkt_loads('POINT (139.542158 36.245434)'), {'id': u'444778917', 'name': u'館林市', 'name:en': u'Tatebayashi', 'place': u'city', 'population': u'76102', 'wikidata': u'Q858016'}), dsl.way(13, wkt_loads('POINT (139.339039 35.907767)'), {'id': u'459653520', 'name': u'日高市', 'name:en': u'Hidaka', 'place': u'city', 'population': u'56224', 'wikidata': u'Q905721'}), dsl.way(14, wkt_loads('POINT (137.968714 36.238205)'), {'id': u'470328639', 'name': u'松本市', 'name:en': u'Matsumoto', 'place': u'city', 'population': u'227579', 'wikidata': u'Q213324'}), dsl.way(15, wkt_loads('POINT (139.563534 35.712898)'), {'id': u'509904081', 'name': u'武蔵野市', 'name:en': u'Musashino', 'place': u'city', 'population': u'140162', 'wikidata': u'Q210661'}), dsl.way(16, wkt_loads('POINT (139.572916 35.685227)'), {'id': u'527555169', 'name': u'三鷹市', 'name:en': u'Mitaka', 'place': u'city', 'population': u'189577', 'wikidata': u'Q242885'}), dsl.way(17, wkt_loads('POINT (139.485693 35.925115)'), {'id': u'537121807', 'name': u'川越市', 'name:en': u'Kawagoe', 'place': u'city', 'population': u'350745', 'wikidata': u'Q319740'}), dsl.way(18, wkt_loads('POINT (139.666708 36.061883)'), {'id': u'546630465', 'name': u'久喜市', 'name:en': u'Kuki', 'place': u'city', 'population': u'151598', 'wikidata': u'Q47535'}), dsl.way(19, wkt_loads('POINT (137.698058 35.069431)'), {'id': u'569005471', 'name': u'東栄町', 'name:en': u'Toei', 'place': u'town', 'population': u'3446', 'wikidata': u'Q1354877'}), dsl.way(20, wkt_loads('POINT (139.063283 36.389342)'), {'capital': u'4', 'id': u'574841107', 'name': u'前橋市', 'name:en': u'Maebashi', 'place': u'city', 'population': u'324644', 'wikidata': u'Q201613'}), dsl.way(21, wkt_loads('POINT (139.575977 35.634023)'), {'id': u'602527728', 'name': u'狛江市', 'name:en': u'Komae', 'place': u'city', 'population': u'76234', 'wikidata': u'Q86536'}), dsl.way(22, wkt_loads('POINT (139.554815 35.660036)'), {'id': u'621286703', 'name': u'調布市', 'name:en': u'Chofu', 'place': u'city', 'population': u'232573', 'wikidata': u'Q210667'}), dsl.way(23, wkt_loads('POINT (139.473445 35.661112)'), {'id': u'621890744', 'name': u'府中市', 'name:en': u'Fuchu', 'place': u'city', 'population': u'261991', 'wikidata': u'Q208818'}), dsl.way(24, wkt_loads('POINT (139.283071 35.660175)'), {'id': u'622423997', 'name': u'八王子市', 'name:en': u'Hachioji', 'place': u'city', 'population': u'555517', 'wikidata': u'Q208863'}), dsl.way(25, wkt_loads('POINT (139.414705 35.661072)'), {'id': u'622424880', 'name': u'日野市', 'name:en': u'Hino', 'place': u'city', 'population': u'171309', 'wikidata': u'Q236197'}), dsl.way(26, wkt_loads('POINT (139.507776 35.638229)'), {'id': u'622640333', 'name': u'稲城市', 'name:en': u'Inagi', 'place': u'city', 'population': u'90112', 'wikidata': u'Q317847'}), dsl.way(27, wkt_loads('POINT (139.443503 35.637188)'), {'id': u'622642835', 'name': u'多摩市', 'name:en': u'Tama', 'place': u'city', 'population': u'144348', 'wikidata': u'Q213263'}), dsl.way(28, wkt_loads('POINT (139.664468 35.718123)'), {'id': u'622866764', 'name': u'中野区', 'name:en': u'Nakano', 'place': u'city', 'population': u'336639', 'wikidata': u'Q234087'}), dsl.way(29, wkt_loads('POINT (139.638735 35.74836)'), {'id': u'622868305', 'name': u'練馬区', 'name:en': u'Nerima', 'place': u'city', 'population': u'733150', 'wikidata': u'Q232655'}), dsl.way(30, wkt_loads('POINT (139.605869 35.781705)'), {'id': u'622868936', 'name': u'和光市', 'name:en': u'Wako', 'place': u'city', 'population': u'82017', 'wikidata': u'Q658058'}), dsl.way(31, wkt_loads('POINT (139.593733 35.797086)'), {'id': u'622870825', 'name': u'朝霞市', 'name:en': u'Asaka', 'place': u'city', 'population': u'130764', 'wikidata': u'Q646834'}), dsl.way(32, wkt_loads('POINT (139.442839 35.564193)'), {'id': u'623797057', 'name': u'町田市', 'name:en': u'Machida', 'place': u'city', 'population': u'433720', 'wikidata': u'Q210628'}), dsl.way(33, wkt_loads('POINT (139.454224 35.709674)'), {'id': u'623801472', 'name': u'国分寺市', 'name:en': u'Kokubunji', 'place': u'city', 'population': u'123290', 'wikidata': u'Q317834'}), dsl.way(34, wkt_loads('POINT (139.43624 35.681991)'), {'id': u'623805032', 'name': u'国立市', 'name:en': u'Kunitachi', 'place': u'city', 'population': u'73934', 'wikidata': u'Q330007'}), dsl.way(35, wkt_loads('POINT (139.714222 35.736156)'), {'id': u'656246516', 'name': u'豊島区', 'name:en': u'Toshima', 'place': u'city', 'population': u'298562', 'wikidata': u'Q236680'}), dsl.way(36, wkt_loads('POINT (139.744732 35.71881)'), {'id': u'664479961', 'name': u'文京区', 'name:en': u'Bunkyo', 'place': u'city', 'population': u'227902', 'wikidata': u'Q212713'}), dsl.way(37, wkt_loads('POINT (139.565203 35.793443)'), {'id': u'671141124', 'name': u'新座市', 'name:en': u'Niiza', 'place': u'city', 'population': u'164024', 'wikidata': u'Q386691'}), dsl.way(38, wkt_loads('POINT (139.59305 35.977408)'), {'id': u'671141125', 'name': u'上尾市', 'name:en': u'Ageo', 'place': u'city', 'population': u'227127', 'wikidata': u'Q163888'}), dsl.way(39, wkt_loads('POINT (139.967242 36.184355)'), {'id': u'674922239', 'name': u'下妻市', 'name:en': u'Shimotsuma', 'place': u'city', 'population': u'42635', 'wikidata': u'Q533241'}), dsl.way(40, wkt_loads('POINT (137.70371599999999 35.786805)'), {'id': u'702987312', 'name': u'上松町', 'name:en': u'Agematsu', 'place': u'town', 'population': u'4670', 'wikidata': u'Q374859'}), dsl.way(41, wkt_loads('POINT (137.816191 35.323388)'), {'id': u'702987314', 'name': u'阿南町', 'name:en': u'Anan', 'place': u'town', 'population': u'4962', 'wikidata': u'Q1203314'}), dsl.way(42, wkt_loads('POINT (137.850889 36.502909)'), {'id': u'702987319', 'name': u'大町市', 'name:en': u'Omachi', 'place': u'city', 'population': u'27203', 'wikidata': u'Q385375'}), dsl.way(43, wkt_loads('POINT (137.954916 35.830452)'), {'id': u'702987327', 'name': u'伊那市', 'name:en': u'Ina', 'place': u'city', 'population': u'67077', 'wikidata': u'Q840888'}), dsl.way(44, wkt_loads('POINT (137.878361 35.55155)'), {'id': u'702987329', 'name': u'高森町', 'name:en': u'Takamori', 'place': u'town', 'population': u'13080', 'wikidata': u'Q1203136'}), dsl.way(45, wkt_loads('POINT (137.821952 35.51471)'), {'id': u'702987331', 'name': u'飯田市', 'name:en': u'Iida', 'place': u'city', 'population': u'99350', 'wikidata': u'Q841129'}), dsl.way(46, wkt_loads('POINT (137.938925 35.729671)'), {'id': u'702987332', 'name': u'駒ヶ根市', 'name:en': u'Komagane', 'place': u'city', 'population': u'32321', 'wikidata': u'Q838684'}), dsl.way(47, wkt_loads('POINT (137.909743 35.597496)'), {'id': u'702987333', 'name': u'松川町', 'name:en': u'Matsukawa', 'place': u'town', 'population': u'13167', 'wikidata': u'Q222825'}), dsl.way(48, wkt_loads('POINT (137.905921 35.680007)'), {'id': u'702987335', 'name': u'飯島町', 'name:en': u'Iijima', 'place': u'town', 'population': u'9530', 'wikidata': u'Q522462'}), dsl.way(49, wkt_loads('POINT (137.980492 35.916221)'), {'id': u'702987342', 'name': u'箕輪町', 'name:en': u'Minowa', 'place': u'town', 'population': u'25241', 'wikidata': u'Q1346975'}), dsl.way(50, wkt_loads('POINT (137.924649 35.973252)'), {'id': u'702987343', 'name': u'辰野町', 'name:en': u'Tatsuno', 'place': u'town', 'population': u'19770', 'wikidata': u'Q1347504'}), dsl.way(51, wkt_loads('POINT (138.117682 36.116594)'), {'id': u'702987346', 'name': u'下諏訪町', 'name:en': u'Shimosuwa', 'place': u'town', 'population': u'20236', 'wikidata': u'Q1204211'}), dsl.way(52, wkt_loads('POINT (138.049549 36.07853)'), {'id': u'702987348', 'name': u'岡谷市', 'name:en': u'Okaya', 'place': u'city', 'population': u'50128', 'wikidata': u'Q838672'}), dsl.way(53, wkt_loads('POINT (137.952801 36.124957)'), {'id': u'702987349', 'name': u'塩尻市', 'name:en': u'Shiojiri', 'place': u'city', 'population': u'66979', 'wikidata': u'Q857272'}), dsl.way(54, wkt_loads('POINT (138.114118 36.03209)'), {'id': u'702987350', 'name': u'諏訪市', 'name:en': u'Suwa', 'place': u'city', 'population': u'50140', 'wikidata': u'Q846338'}), dsl.way(55, wkt_loads('POINT (138.031902 36.114395)'), {'id': u'702987351', 'name': u'長野県', 'name:en': u'Nagano Prefecture', 'place': u'province', 'wikidata': u'Q127877'}), dsl.way(56, wkt_loads('POINT (138.157854 35.98562)'), {'id': u'702987356', 'name': u'茅野市', 'name:en': u'Chino', 'place': u'city', 'population': u'55646', 'wikidata': u'Q838660'}), dsl.way(57, wkt_loads('POINT (138.20262 35.908326)'), {'id': u'702987357', 'name': u'富士見町', 'name:en': u'Fujimi', 'place': u'town', 'population': u'14493', 'wikidata': u'Q1204145'}), dsl.way(58, wkt_loads('POINT (138.48351 36.160367)'), {'id': u'702987361', 'name': u'佐久穂町', 'name:en': u'Sakuho', 'place': u'town', 'population': u'11186', 'wikidata': u'Q1203700'}), dsl.way(59, wkt_loads('POINT (138.214356 36.187804)'), {'id': u'702987362', 'name': u'長和町', 'name:en': u'Nagawa', 'place': u'town', 'population': u'6166', 'wikidata': u'Q1346846'}), dsl.way(60, wkt_loads('POINT (138.485497 36.079973)'), {'id': u'702987363', 'name': u'小海町', 'name:en': u'Koumi', 'place': u'town', 'population': u'4713', 'wikidata': u'Q1204222'}), dsl.way(61, wkt_loads('POINT (137.905497 36.304408)'), {'id': u'702987365', 'name': u'安曇野市', 'name:en': u'Azumino', 'place': u'city', 'population': u'94871', 'wikidata': u'Q534667'}), dsl.way(62, wkt_loads('POINT (137.87459 36.421327)'), {'id': u'702987373', 'name': u'池田町', 'name:en': u'Ikeda', 'place': u'town', 'population': u'9926', 'wikidata': u'Q1204048'}), dsl.way(63, wkt_loads('POINT (139.681209 35.774143)'), {'id': u'714895390', 'name': u'板橋区', 'name:en': u'Itabashi', 'place': u'city', 'population': u'575432', 'wikidata': u'Q232635'}), dsl.way(64, wkt_loads('POINT (139.636288 35.699493)'), {'id': u'718383251', 'name': u'杉並区', 'name:en': u'Suginami', 'place': u'city', 'population': u'540180', 'wikidata': u'Q232631'}), dsl.way(65, wkt_loads('POINT (139.805017 35.700429)'), {'id': u'721772119', 'name': u'墨田区', 'name:en': u'Sumida', 'place': u'city', 'population': u'263484', 'wikidata': u'Q235135'}), dsl.way(66, wkt_loads('POINT (139.871091 35.678278)'), {'id': u'721783580', 'name': u'江戸川区', 'name:en': u'Edogawa', 'place': u'city', 'population': u'691417', 'wikidata': u'Q214056'}), dsl.way(67, wkt_loads('POINT (139.863816 35.751733)'), {'id': u'721783585', 'name': u'葛飾区', 'name:en': u'Katsushika', 'place': u'city', 'population': u'451483', 'wikidata': u'Q232628'}), dsl.way(68, wkt_loads('POINT (139.81279 35.649154)'), {'admin_leve': u'7', 'id': u'721916368', 'name': u'江東区', 'name:en': u'Koto', 'place': u'city', 'population': u'509438', 'wikidata': u'Q215175'}), dsl.way(69, wkt_loads('POINT (139.736687 35.755838)'), {'id': u'722053207', 'name': u'北区', 'name:en': u'Kita', 'place': u'city', 'population': u'349573', 'wikidata': u'Q235130'}), dsl.way(70, wkt_loads('POINT (140.303574 35.972278)'), {'id': u'734950653', 'name': u'稲敷市', 'name:en': u'Inashiki', 'place': u'city', 'population': u'41392', 'wikidata': u'Q838675'}), dsl.way(71, wkt_loads('POINT (140.471393 36.365779)'), {'capital': u'4', 'id': u'736355846', 'name': u'水戸市', 'name:en': u'Mito', 'place': u'city', 'population': u'270775', 'wikidata': u'Q204249'}), dsl.way(72, wkt_loads('POINT (140.304226 36.345224)'), {'id': u'737237199', 'name': u'笠間市', 'name:en': u'Kasama', 'place': u'city', 'population': u'75698', 'wikidata': u'Q845851'}), dsl.way(73, wkt_loads('POINT (140.352368 36.238976)'), {'id': u'737237574', 'name': u'小美玉市', 'name:en': u'Omitama', 'place': u'city', 'population': u'50180', 'wikidata': u'Q430584'}), dsl.way(74, wkt_loads('POINT (140.287431 36.190599)'), {'id': u'738650161', 'name': u'石岡市', 'name:en': u'Ishioka', 'place': u'city', 'population': u'74184', 'wikidata': u'Q819658'}), dsl.way(75, wkt_loads('POINT (140.487177 36.457227)'), {'id': u'742470966', 'name': u'那珂市', 'name:en': u'Naka', 'place': u'city', 'population': u'53897', 'wikidata': u'Q633647'}), dsl.way(76, wkt_loads('POINT (140.204593 36.07863)'), {'id': u'750504981', 'name': u'土浦市', 'name:en': u'Tsuchiura', 'place': u'city', 'population': u'139261', 'wikidata': u'Q653446'}), dsl.way(77, wkt_loads('POINT (140.53534 36.396124)'), {'id': u'752603189', 'name': u'ひたちなか市', 'name:en': u'Hitachinaka', 'place': u'city', 'population': u'155970', 'wikidata': u'Q696772'}), dsl.way(78, wkt_loads('POINT (140.424093 36.287119)'), {'id': u'760258942', 'name': u'茨城町', 'name:en': u'Ibaraki', 'place': u'town', 'population': u'32921', 'wikidata': u'Q1203390'}), dsl.way(79, wkt_loads('POINT (140.574722 36.313338)'), {'id': u'760279839', 'name': u'大洗町', 'name:en': u'Oarai', 'place': u'town', 'population': u'16886', 'wikidata': u'Q1349185'}), dsl.way(80, wkt_loads('POINT (140.530839 36.537302)'), {'id': u'761127819', 'name': u'常陸太田市', 'name:en': u'Hitachiota', 'place': u'city', 'population': u'50728', 'wikidata': u'Q838663'}), dsl.way(81, wkt_loads('POINT (140.376047 36.479676)'), {'id': u'761151452', 'name': u'城里町', 'name:en': u'Shirosato', 'place': u'town', 'population': u'19800', 'wikidata': u'Q1203068'}), dsl.way(82, wkt_loads('POINT (138.087355 34.756264)'), {'id': u'763099410', 'name': u'菊川市', 'name:en': u'Kikugawa', 'place': u'city', 'population': u'46849', 'wikidata': u'Q726565'}), dsl.way(83, wkt_loads('POINT (138.30381 34.830312)'), {'id': u'763099666', 'name': u'焼津市', 'name:en': u'Yaizu', 'place': u'city', 'population': u'137453', 'wikidata': u'Q696783'}), dsl.way(84, wkt_loads('POINT (138.257722 34.867417)'), {'id': u'763099670', 'name': u'藤枝市', 'name:en': u'Fujieda', 'place': u'city', 'population': u'143227', 'wikidata': u'Q734432'}), dsl.way(85, wkt_loads('POINT (138.948903 35.147361)'), {'id': u'763099675', 'name': u'三島市', 'name:en': u'Mishima', 'place': u'city', 'population': u'109515', 'wikidata': u'Q653478'}), dsl.way(86, wkt_loads('POINT (138.146599 34.879912)'), {'id': u'763099677', 'name': u'島田市', 'name:en': u'Shimada', 'place': u'city', 'population': u'96478', 'wikidata': u'Q605256'}), dsl.way(87, wkt_loads('POINT (138.866742 35.094699)'), {'id': u'763099680', 'name': u'沼津市', 'name:en': u'Numazu', 'place': u'city', 'population': u'195633', 'wikidata': u'Q241037'}), dsl.way(88, wkt_loads('POINT (138.621468 35.222137)'), {'id': u'763118286', 'name': u'富士宮市', 'name:en': u'Fujinomiya', 'place': u'city', 'population': u'129951', 'wikidata': u'Q496072'}), dsl.way(89, wkt_loads('POINT (137.725943 34.710979)'), {'id': u'763118297', 'name': u'浜松市', 'name:en': u'Hamamatsu', 'place': u'city', 'population': u'797033', 'wikidata': u'Q185125'}), dsl.way(90, wkt_loads('POINT (138.676386 35.161852)'), {'id': u'763118309', 'name': u'富士市', 'name:en': u'Fuji', 'place': u'city', 'population': u'253273', 'wikidata': u'Q328613'}), dsl.way(91, wkt_loads('POINT (138.38299 34.979149)'), {'capital': u'4', 'id': u'763118317', 'name': u'静岡市', 'name:en': u'Shizuoka', 'place': u'city', 'population': u'706287', 'wikidata': u'Q174691'}), dsl.way(92, wkt_loads('POINT (140.07651 36.083388)'), {'id': u'768273008', 'name': u'つくば市', 'name:en': u'Tsukuba', 'place': u'city', 'population': u'234455', 'wikidata': u'Q273863'}), dsl.way(93, wkt_loads('POINT (139.476606 35.72522)'), {'id': u'771323155', 'name': u'小平市', 'name:en': u'Kodaira', 'place': u'city', 'population': u'191406', 'wikidata': u'Q213278'}), dsl.way(94, wkt_loads('POINT (140.237087 36.151737)'), {'id': u'775480576', 'name': u'かすみがうら市', 'name:en': u'Kasumigaura', 'place': u'city', 'population': u'41297', 'wikidata': u'Q772817'}), dsl.way(95, wkt_loads('POINT (139.522106 36.065758)'), {'id': u'820097446', 'name': u'鴻巣市', 'name:en': u'Konosu', 'place': u'city', 'population': u'117883', 'wikidata': u'Q734541'}), dsl.way(96, wkt_loads('POINT (139.603225 36.130857)'), {'id': u'820110092', 'name': u'加須市', 'name:en': u'Kazo', 'place': u'city', 'population': u'111572', 'wikidata': u'Q851680'}), dsl.way(97, wkt_loads('POINT (139.541356 36.002152)'), {'id': u'820134979', 'name': u'桶川市', 'name:en': u'Okegawa', 'place': u'city', 'population': u'74186', 'wikidata': u'Q570333'}), dsl.way(98, wkt_loads('POINT (139.530139 36.026871)'), {'id': u'820134983', 'name': u'北本市', 'name:en': u'Kitamoto', 'place': u'city', 'population': u'66339', 'wikidata': u'Q857285'}), dsl.way(99, wkt_loads('POINT (139.2817 36.197402)'), {'id': u'820591253', 'name': u'深谷市', 'name:en': u'Fukaya', 'place': u'city', 'population': u'142996', 'wikidata': u'Q734532'}), dsl.way(100, wkt_loads('POINT (139.191628 36.243594)'), {'id': u'820591261', 'name': u'本庄市', 'name:en': u'Honjo', 'place': u'city', 'population': u'77881', 'wikidata': u'Q873565'}), dsl.way(101, wkt_loads('POINT (139.399796 36.042152)'), {'id': u'820603381', 'name': u'東松山市', 'name:en': u'Higashimatsuyama', 'place': u'city', 'population': u'92125', 'wikidata': u'Q823907'}), dsl.way(102, wkt_loads('POINT (139.872225 35.830091)'), {'id': u'854693636', 'name': u'三郷市', 'name:en': u'Misato', 'place': u'city', 'population': u'139903', 'wikidata': u'Q853061'}), dsl.way(103, wkt_loads('POINT (139.453534 36.039842)'), {'id': u'863420607', 'name': u'吉見町', 'name:en': u'Yoshimi', 'place': u'town', 'population': u'19631', 'wikidata': u'Q543313'}), dsl.way(104, wkt_loads('POINT (139.192778 36.118274)'), {'id': u'863425361', 'name': u'寄居町', 'name:en': u'Yorii Town', 'place': u'town', 'population': u'34081', 'wikidata': u'Q961604'}), dsl.way(105, wkt_loads('POINT (139.109648 36.114676)'), {'id': u'863429893', 'name': u'長瀞町', 'name:en': u'Nagatoro', 'place': u'town', 'population': u'7324', 'wikidata': u'Q1345299'}), dsl.way(106, wkt_loads('POINT (139.26285 36.057154)'), {'id': u'863433506', 'name': u'小川町', 'name:en': u'Ogawa', 'place': u'town', 'population': u'31178', 'wikidata': u'Q935037'}), dsl.way(107, wkt_loads('POINT (139.320248 36.056417)'), {'id': u'863443078', 'name': u'嵐山町', 'name:en': u'Ranzan', 'place': u'town', 'population': u'18341', 'wikidata': u'Q1358642'}), dsl.way(108, wkt_loads('POINT (139.181679 36.177163)'), {'id': u'863449326', 'name': u'美里町', 'name:en': u'Misato', 'place': u'town', 'population': u'11207', 'wikidata': u'Q924129'}), dsl.way(109, wkt_loads('POINT (139.361022 36.067122)'), {'id': u'863457603', 'name': u'滑川町', 'name:en': u'Namegawa', 'place': u'town', 'population': u'18212', 'wikidata': u'Q1346985'}), dsl.way(110, wkt_loads('POINT (139.144691 36.251548)'), {'id': u'863460004', 'name': u'上里町', 'name:en': u'Kamisato', 'place': u'town', 'population': u'30565', 'wikidata': u'Q1345287'}), dsl.way(111, wkt_loads('POINT (139.101903 36.213474)'), {'id': u'863466502', 'name': u'神川町', 'name:en': u'Kamikawa', 'place': u'town', 'population': u'13730', 'wikidata': u'Q1346757'}), dsl.way(112, wkt_loads('POINT (139.098645 36.070827)'), {'id': u'863476103', 'name': u'皆野町', 'name:en': u'Minano', 'place': u'town', 'population': u'10133', 'wikidata': u'Q1345365'}), dsl.way(113, wkt_loads('POINT (139.008513 36.017118)'), {'id': u'863479149', 'name': u'小鹿野町', 'name:en': u'Ogano', 'place': u'town', 'population': u'12117', 'wikidata': u'Q1345311'}), dsl.way(114, wkt_loads('POINT (139.1 35.987323)'), {'id': u'863493320', 'name': u'横瀬町', 'name:en': u'Yokoze', 'place': u'town', 'population': u'8519', 'wikidata': u'Q1345277'}), dsl.way(115, wkt_loads('POINT (139.296697 36.008531)'), {'id': u'863522250', 'name': u'ときがわ町', 'name:en': u'Tokigawa', 'place': u'town', 'population': u'11492', 'wikidata': u'Q251027'}), dsl.way(116, wkt_loads('POINT (139.294131 35.964506)'), {'id': u'863522262', 'name': u'越生町', 'name:en': u'Ogose', 'place': u'town', 'population': u'11716', 'wikidata': u'Q783333'}), dsl.way(117, wkt_loads('POINT (139.334087 35.981517)'), {'id': u'863556895', 'name': u'鳩山町', 'name:en': u'Hatoyama', 'place': u'town', 'population': u'14338', 'wikidata': u'Q925875'}), dsl.way(118, wkt_loads('POINT (139.484081 35.992441)'), {'id': u'863580022', 'name': u'川島町', 'name:en': u'Kawajima', 'place': u'town', 'population': u'20788', 'wikidata': u'Q1203970'}), dsl.way(119, wkt_loads('POINT (139.316039 35.941569)'), {'id': u'863587414', 'name': u'毛呂山町', 'name:en': u'Moroyama', 'place': u'town', 'population': u'37275', 'wikidata': u'Q1354799'}), dsl.way(120, wkt_loads('POINT (139.392974 35.934681)'), {'id': u'863601289', 'name': u'鶴ヶ島市', 'name:en': u'Tsurugashima', 'place': u'city', 'population': u'70255', 'wikidata': u'Q869027'}), dsl.way(121, wkt_loads('POINT (139.4123 35.852897)'), {'id': u'863611983', 'name': u'狭山市', 'name:en': u'Sayama', 'place': u'city', 'population': u'152405', 'wikidata': u'Q824009'}), dsl.way(122, wkt_loads('POINT (139.468748 35.799427)'), {'id': u'863622554', 'name': u'所沢市', 'name:en': u'Tokorozawa', 'place': u'city', 'population': u'341091', 'wikidata': u'Q165857'}), dsl.way(123, wkt_loads('POINT (139.390929 35.835814)'), {'id': u'863647764', 'name': u'入間市', 'name:en': u'Iruma', 'place': u'city', 'population': u'147430', 'wikidata': u'Q696925'}), dsl.way(124, wkt_loads('POINT (139.519616 35.879548)'), {'id': u'863664907', 'name': u'ふじみ野市', 'name:en': u'Fujimino', 'place': u'city', 'population': u'114218', 'wikidata': u'Q873590'}), dsl.way(125, wkt_loads('POINT (139.526484 35.828071)'), {'id': u'863670473', 'name': u'三芳町', 'name:en': u'Miyoshi', 'place': u'town', 'population': u'38456'}), dsl.way(126, wkt_loads('POINT (139.549073 35.856555)'), {'id': u'863670497', 'name': u'富士見市', 'name:en': u'Fujimi', 'place': u'city', 'population': u'108102', 'wikidata': u'Q495809'}), dsl.way(127, wkt_loads('POINT (139.580035 35.836519)'), {'id': u'863684931', 'name': u'志木市', 'name:en': u'Shiki', 'place': u'city', 'population': u'72676', 'wikidata': u'Q877202'}), dsl.way(128, wkt_loads('POINT (139.725409 36.077883)'), {'id': u'864242320', 'name': u'幸手市', 'name:en': u'Satte', 'place': u'city', 'population': u'51797', 'wikidata': u'Q868971'}), dsl.way(129, wkt_loads('POINT (139.736745 36.025848)'), {'id': u'864242816', 'name': u'杉戸町', 'name:en': u'Sugito', 'place': u'town', 'population': u'45495', 'wikidata': u'Q1345351'}), dsl.way(130, wkt_loads('POINT (139.722628 36.022709)'), {'id': u'864242817', 'name': u'宮代町', 'name:en': u'Miyashiro', 'place': u'town', 'population': u'33930', 'wikidata': u'Q155317'}), dsl.way(131, wkt_loads('POINT (139.752019 35.975796)'), {'id': u'864248665', 'name': u'春日部市', 'name:en': u'Kasukabe', 'place': u'city', 'population': u'232709', 'wikidata': u'Q376023'}), dsl.way(132, wkt_loads('POINT (139.663255 35.994092)'), {'id': u'864248673', 'name': u'蓮田市', 'name:en': u'Hasuda', 'place': u'city', 'population': u'62063', 'wikidata': u'Q857256'}), dsl.way(133, wkt_loads('POINT (139.815881 35.926196)'), {'id': u'864248683', 'name': u'松伏町', 'name:en': u'Matsubushi', 'place': u'town', 'population': u'30061', 'wikidata': u'Q1346963'}), dsl.way(134, wkt_loads('POINT (139.854504 35.896283)'), {'id': u'864255936', 'name': u'吉川市', 'name:en': u'Yoshikawa', 'place': u'city', 'population': u'71063', 'wikidata': u'Q873546'}), dsl.way(135, wkt_loads('POINT (139.806178 35.826223)'), {'id': u'864255937', 'name': u'草加市', 'name:en': u'Soka', 'place': u'city', 'population': u'249455', 'wikidata': u'Q734442'}), dsl.way(136, wkt_loads('POINT (139.838687 35.82264)'), {'id': u'864255938', 'name': u'八潮市', 'name:en': u'Yashio', 'place': u'city', 'population': u'90017', 'wikidata': u'Q869032'}), dsl.way(137, wkt_loads('POINT (139.790863 35.890399)'), {'id': u'864255939', 'name': u'越谷市', 'name:en': u'Koshigaya', 'place': u'city', 'population': u'342486', 'wikidata': u'Q497952'}), dsl.way(138, wkt_loads('POINT (139.724105 35.807823)'), {'id': u'864262454', 'name': u'川口市', 'name:en': u'Kawaguchi', 'place': u'city', 'population': u'578112', 'wikidata': u'Q387136'}), dsl.way(139, wkt_loads('POINT (139.677894 35.817587)'), {'id': u'864262458', 'name': u'戸田市', 'name:en': u'Toda', 'place': u'city', 'population': u'136150', 'wikidata': u'Q823874'}), dsl.way(140, wkt_loads('POINT (139.679763 35.82564)'), {'id': u'864262459', 'name': u'蕨市', 'name:en': u'Warabi', 'place': u'city', 'population': u'72260', 'wikidata': u'Q673010'}), dsl.way(141, wkt_loads('POINT (139.624088 36.000132)'), {'id': u'864266122', 'name': u'伊奈町', 'name:en': u'Ina', 'place': u'town', 'population': u'44442', 'wikidata': u'Q915773'}), dsl.way(142, wkt_loads('POINT (139.790859 35.71745)'), {'id': u'1042491447', 'name': u'台東区', 'name:en': u'Taito', 'place': u'city', 'population': u'203893', 'wikidata': u'Q232641'}), dsl.way(143, wkt_loads('POINT (139.753216 35.69381)'), {'id': u'1042516435', 'name': u'千代田区', 'name:en': u'Chiyoda', 'place': u'city', 'population': u'46397', 'wikidata': u'Q214051'}), dsl.way(144, wkt_loads('POINT (139.350065 35.70248)'), {'id': u'1054320920', 'name': u'昭島市', 'name:en': u'Akishima', 'place': u'city', 'population': u'111482', 'wikidata': u'Q212494'}), dsl.way(145, wkt_loads('POINT (139.443146 36.217976)'), {'id': u'1068823539', 'name': u'千代田町', 'name:en': u'Chiyoda', 'place': u'town', 'population': u'11318', 'wikidata': u'Q1023773'}), dsl.way(146, wkt_loads('POINT (138.820495 36.571536)'), {'id': u'1068823547', 'name': u'東吾妻町', 'name:en': u'Higashiagatsuma', 'place': u'town', 'population': u'14033', 'wikidata': u'Q1203419'}), dsl.way(147, wkt_loads('POINT (139.074502 36.258633)'), {'id': u'1068823554', 'name': u'藤岡市', 'name:en': u'Fujioka', 'place': u'city', 'population': u'64679', 'wikidata': u'Q596486'}), dsl.way(148, wkt_loads('POINT (139.115025 36.304424)'), {'id': u'1068823567', 'name': u'玉村町', 'name:en': u'Tamamura', 'place': u'town', 'population': u'36654', 'wikidata': u'Q1203600'}), dsl.way(149, wkt_loads('POINT (138.840906 36.589891)'), {'id': u'1068823586', 'name': u'中之条町', 'name:en': u'Nakanojo', 'place': u'town', 'population': u'16850', 'wikidata': u'Q967920'}), dsl.way(150, wkt_loads('POINT (138.889979 36.259827)'), {'id': u'1068823595', 'name': u'富岡市', 'name:en': u'Tomioka', 'place': u'city', 'population': u'48799', 'wikidata': u'Q873835'}), dsl.way(151, wkt_loads('POINT (139.033483 36.52198)'), {'id': u'1068823601', 'name': u'群馬県', 'name:en': u'Gunma Prefecture', 'place': u'province'}), dsl.way(152, wkt_loads('POINT (139.281093 36.394802)'), {'id': u'1068823637', 'name': u'みどり市', 'name:en': u'Midori', 'place': u'city', 'population': u'50680', 'wikidata': u'Q576556'}), dsl.way(153, wkt_loads('POINT (139.000129 36.489461)'), {'id': u'1068823640', 'name': u'渋川市', 'name:en': u'Shibukawa', 'place': u'city', 'population': u'76552', 'wikidata': u'Q851492'}), dsl.way(154, wkt_loads('POINT (138.789044 36.212527)'), {'id': u'1068823641', 'name': u'下仁田町', 'name:en': u'Shimonita', 'place': u'town', 'population': u'7564', 'wikidata': u'Q1346871'}), dsl.way(155, wkt_loads('POINT (139.009713 36.447388)'), {'id': u'1068823645', 'name': u'吉岡町', 'name:en': u'Yoshioka', 'place': u'town', 'population': u'21080', 'wikidata': u'Q1154580'}), dsl.way(156, wkt_loads('POINT (139.331021 36.40553)'), {'id': u'1068823646', 'name': u'桐生市', 'name:en': u'Kiryu', 'place': u'city', 'population': u'111554', 'wikidata': u'Q634022'}), dsl.way(157, wkt_loads('POINT (138.921632 36.242863)'), {'id': u'1068823647', 'name': u'甘楽町', 'name:en': u'Kanra', 'place': u'town', 'population': u'13200', 'wikidata': u'Q1203523'}), dsl.way(158, wkt_loads('POINT (138.916716 36.116)'), {'id': u'1068823648', 'name': u'神流町', 'name:en': u'Kanna', 'place': u'town', 'population': u'1954', 'wikidata': u'Q1203059'}), dsl.way(159, wkt_loads('POINT (139.003276 36.322098)'), {'id': u'1068823649', 'name': u'高崎市', 'name:en': u'Takasaki', 'place': u'city', 'population': u'370176', 'wikidata': u'Q336438'}), dsl.way(160, wkt_loads('POINT (138.64996 36.543771)'), {'id': u'1068823654', 'name': u'長野原町', 'name:en': u'Naganohara', 'place': u'town', 'population': u'5536', 'wikidata': u'Q1203366'}), dsl.way(161, wkt_loads('POINT (139.375423 36.291156)'), {'id': u'1068823657', 'name': u'太田市', 'name:en': u'Ota', 'place': u'city', 'population': u'221403', 'wikidata': u'Q386179'}), dsl.way(162, wkt_loads('POINT (138.596085 36.620667)'), {'id': u'1068823658', 'name': u'草津町', 'name:en': u'Kusatsu', 'place': u'town', 'population': u'6518', 'wikidata': u'Q1358949'}), dsl.way(163, wkt_loads('POINT (139.416011 35.975417)'), {'admin_leve': u'4', 'id': u'1068823662', 'name': u'埼玉県', 'name:en': u'Saitama Prefecture', 'place': u'province'}), dsl.way(164, wkt_loads('POINT (139.405421 36.247743)'), {'id': u'1068823675', 'name': u'大泉町', 'name:en': u'Oizumi', 'place': u'town', 'population': u'41202', 'wikidata': u'Q385080'}), dsl.way(165, wkt_loads('POINT (139.196808 36.311173)'), {'id': u'1068823679', 'name': u'伊勢崎市', 'name:en': u'Isesaki', 'place': u'city', 'population': u'209895', 'wikidata': u'Q328596'}), dsl.way(166, wkt_loads('POINT (140.181878 35.911316)'), {'id': u'1079080827', 'name': u'龍ケ崎市', 'name:en': u'Ryugasaki', 'place': u'city', 'population': u'77433', 'wikidata': u'Q844138'}), dsl.way(167, wkt_loads('POINT (140.058324 36.548274)'), {'id': u'1108891166', 'name': u'芳賀町', 'name:en': u'Haga', 'place': u'town', 'population': u'15189', 'wikidata': u'Q1203553'}), dsl.way(168, wkt_loads('POINT (139.733591 36.381818)'), {'id': u'1108891177', 'name': u'栃木市', 'name:en': u'Tochigi', 'place': u'city', 'population': u'157645', 'wikidata': u'Q44830'}), dsl.way(169, wkt_loads('POINT (139.804607 36.427353)'), {'id': u'1108891188', 'name': u'壬生町', 'name:en': u'Mibu', 'place': u'town', 'population': u'39951', 'wikidata': u'Q1354910'}), dsl.way(170, wkt_loads('POINT (139.882878 36.554968)'), {'capital': u'4', 'id': u'1108891208', 'name': u'宇都宮市', 'name:en': u'Utsunomiya', 'place': u'city', 'population': u'518594', 'wikidata': u'Q200589'}), dsl.way(171, wkt_loads('POINT (139.740778 36.23313)'), {'id': u'1108891226', 'name': u'野木町', 'name:en': u'Nogi', 'place': u'town', 'population': u'25292', 'wikidata': u'Q1203180'}), dsl.way(172, wkt_loads('POINT (139.909834 36.439316)'), {'id': u'1108891240', 'name': u'上三川町', 'name:en': u'Kaminokawa', 'place': u'town', 'population': u'31046', 'wikidata': u'Q1345604'}), dsl.way(173, wkt_loads('POINT (139.449773 36.340191)'), {'id': u'1108891308', 'name': u'足利市', 'name:en': u'Ashikaga', 'place': u'city', 'population': u'147699', 'wikidata': u'Q374477'}), dsl.way(174, wkt_loads('POINT (140.093597 36.46735)'), {'id': u'1108891330', 'name': u'益子町', 'name:en': u'Mashiko', 'place': u'town', 'population': u'23281', 'wikidata': u'Q1346925'}), dsl.way(175, wkt_loads('POINT (140.013158 36.440445)'), {'id': u'1108891341', 'name': u'真岡市', 'name:en': u'Mooka', 'place': u'city', 'population': u'79548', 'wikidata': u'Q498060'}), dsl.way(176, wkt_loads('POINT (140.187406 36.532164)'), {'id': u'1108891343', 'name': u'茂木町', 'name:en': u'Motegi', 'place': u'town', 'population': u'13188', 'wikidata': u'Q644327'}), dsl.way(177, wkt_loads('POINT (140.102152 36.543254)'), {'id': u'1108891361', 'name': u'市貝町', 'name:en': u'Ichikai', 'place': u'town', 'population': u'11720', 'wikidata': u'Q577654'}), dsl.way(178, wkt_loads('POINT (139.578429 36.314412)'), {'id': u'1108891363', 'name': u'佐野市', 'name:en': u'Sano', 'place': u'city', 'population': u'117521', 'wikidata': u'Q646912'}), dsl.way(179, wkt_loads('POINT (139.800148 36.314737)'), {'id': u'1108891371', 'name': u'小山市', 'name:en': u'Oyama', 'place': u'city', 'population': u'167535', 'wikidata': u'Q374511'}), dsl.way(180, wkt_loads('POINT (139.775565 35.666255)'), {'admin_leve': u'7', 'id': u'1111454595', 'name': u'中央区', 'name:en': u'Chuo', 'place': u'city', 'population': u'158508', 'wikidata': u'Q212704'}), dsl.way(181, wkt_loads('POINT (139.78131 35.737529)'), {'id': u'1111454600', 'name': u'荒川区', 'name:en': u'Arakawa', 'place': u'city', 'population': u'216232', 'wikidata': u'Q232624'}), dsl.way(182, wkt_loads('POINT (139.715843 35.561206)'), {'id': u'1111454606', 'name': u'大田区', 'name:en': u'Ota', 'place': u'city', 'population': u'728349', 'wikidata': u'Q217234'}), dsl.way(183, wkt_loads('POINT (139.795319 35.783703)'), {'id': u'1111454619', 'name': u'足立区', 'name:en': u'Adachi', 'place': u'city', 'population': u'676761', 'wikidata': u'Q213464'}), dsl.way(184, wkt_loads('POINT (139.740055 35.643227)'), {'admin_leve': u'7', 'id': u'1111454640', 'name': u'港区', 'name:en': u'Minato', 'place': u'city', 'population': u'254699', 'wikidata': u'Q190088'}), dsl.way(185, wkt_loads('POINT (139.65627 35.646096)'), {'admin_leve': u'8', 'id': u'1111454647', 'name': u'世田谷区', 'name:en': u'Setagaya', 'place': u'city', 'population': u'860071', 'wikidata': u'Q231645'}), dsl.way(186, wkt_loads('POINT (139.73891 35.599252)'), {'admin_leve': u'7', 'id': u'1111454665', 'name': u'品川区', 'name:en': u'Shinagawa', 'place': u'city', 'population': u'396993', 'wikidata': u'Q233495'}), dsl.way(187, wkt_loads('POINT (140.213603 36.030794)'), {'id': u'1125034214', 'name': u'阿見町', 'name:en': u'Ami', 'place': u'town', 'population': u'47535', 'wikidata': u'Q1203814'}), dsl.way(188, wkt_loads('POINT (140.65046 36.599123)'), {'admin_leve': u'7', 'id': u'1211787259', 'name': u'日立市', 'name:en': u'Hitachi', 'place': u'city', 'population': u'189958', 'wikidata': u'Q633922'}), dsl.way(189, wkt_loads('POINT (138.260561 34.773784)'), {'id': u'1407195635', 'name': u'吉田町', 'name:en': u'Yoshida', 'place': u'town', 'population': u'29093', 'wikidata': u'Q1202789'}), dsl.way(190, wkt_loads('POINT (138.104479 35.163515)'), {'id': u'1407195637', 'name': u'川根本町', 'name:en': u'Kawanehoncho', 'place': u'town', 'population': u'7192', 'wikidata': u'Q1204025'}), dsl.way(191, wkt_loads('POINT (139.755364 36.178025)'), {'id': u'1419245750', 'name': u'古河市', 'name:en': u'Koga', 'place': u'city', 'population': u'140150', 'wikidata': u'Q836836'}), dsl.way(192, wkt_loads('POINT (139.993871 36.023569)'), {'id': u'1429506750', 'name': u'常総市', 'name:en': u'Joso', 'place': u'city', 'population': u'60829', 'wikidata': u'Q851149'}), dsl.way(193, wkt_loads('POINT (139.698711 35.664596)'), {'id': u'1438867377', 'name': u'渋谷区', 'name:en': u'Shibuya', 'place': u'city', 'population': u'230707', 'wikidata': u'Q193638'}), dsl.way(194, wkt_loads('POINT (139.404766 35.724463)'), {'id': u'1440311172', 'name': u'立川市', 'name:en': u'Tachikawa', 'place': u'city', 'population': u'179575', 'wikidata': u'Q269634'}), dsl.way(195, wkt_loads('POINT (139.238128 35.803601)'), {'id': u'1440354068', 'name': u'青梅市', 'name:en': u'Ome', 'place': u'city', 'population': u'136581', 'wikidata': u'Q237683'}), dsl.way(196, wkt_loads('POINT (140.470338 36.286954)'), {'id': u'1475102974', 'name': u'茨城県', 'name:en': u'Ibaraki Prefecture', 'place': u'province'}), dsl.way(197, wkt_loads('POINT (139.385637 35.756509)'), {'id': u'1513641959', 'name': u'武蔵村山市', 'name:en': u'Musashimurayama', 'place': u'city', 'population': u'71419', 'wikidata': u'Q390806'}), dsl.way(198, wkt_loads('POINT (139.217028 35.731042)'), {'id': u'1513663376', 'name': u'あきる野市', 'name:en': u'Akiruno', 'place': u'city', 'population': u'80787', 'wikidata': u'Q240480'}), dsl.way(199, wkt_loads('POINT (139.096172 35.80966)'), {'id': u'1513663380', 'name': u'奥多摩町', 'name:en': u'Okutama', 'place': u'town', 'population': u'5234', 'wikidata': u'Q598626'}), dsl.way(200, wkt_loads('POINT (139.223819 35.758719)'), {'id': u'1513663382', 'name': u'日の出町', 'name:en': u'Hinode', 'place': u'town', 'population': u'17448', 'wikidata': u'Q1154806'}), dsl.way(201, wkt_loads('POINT (139.334682 35.737188)'), {'id': u'1513663390', 'name': u'福生市', 'name:en': u'Fussa', 'place': u'city', 'population': u'58444', 'wikidata': u'Q317813'}), dsl.way(202, wkt_loads('POINT (139.307862 35.764833)'), {'id': u'1513663393', 'name': u'羽村市', 'name:en': u'Hamura', 'place': u'city', 'population': u'55434', 'wikidata': u'Q270465'}), dsl.way(203, wkt_loads('POINT (139.87714 36.305295)'), {'id': u'1513697885', 'name': u'結城市', 'name:en': u'Yuki', 'place': u'city', 'population': u'51332', 'wikidata': u'Q847569'}), dsl.way(204, wkt_loads('POINT (139.345734 35.784056)'), {'id': u'1517292206', 'name': u'瑞穂町', 'name:en': u'Mizuho', 'place': u'town', 'population': u'33194', 'wikidata': u'Q975797'}), dsl.way(205, wkt_loads('POINT (139.08775 35.632505)'), {'id': u'1598836214', 'name': u'上野原市', 'name:en': u'Uenohara', 'place': u'city', 'population': u'23785', 'wikidata': u'Q851030'}), dsl.way(206, wkt_loads('POINT (138.916862 35.643042)'), {'id': u'1599607817', 'name': u'大月市', 'name:en': u'Otsuki', 'place': u'city', 'population': u'24329', 'wikidata': u'Q386508'}), dsl.way(207, wkt_loads('POINT (138.846894 35.524113)'), {'id': u'1610335916', 'name': u'西桂町', 'name:en': u'Nishikatsura', 'place': u'town', 'population': u'4342', 'wikidata': u'Q1203881'}), dsl.way(208, wkt_loads('POINT (138.905487 35.551618)'), {'id': u'1610335917', 'name': u'都留市', 'name:en': u'Tsuru', 'place': u'city', 'population': u'31414', 'wikidata': u'Q747362'}), dsl.way(209, wkt_loads('POINT (138.934829 35.369862)'), {'id': u'1617003546', 'name': u'小山町', 'name:en': u'Oyama', 'place': u'town', 'population': u'19497', 'wikidata': u'Q726418'}), dsl.way(210, wkt_loads('POINT (138.877573 35.301048)'), {'id': u'1619235769', 'name': u'御殿場市', 'name:en': u'Gotemba', 'place': u'city', 'population': u'87929', 'wikidata': u'Q735175'}), dsl.way(211, wkt_loads('POINT (139.510676 35.704108)'), {'id': u'1619811558', 'name': u'小金井市', 'name:en': u'Koganei', 'place': u'city', 'population': u'122977', 'wikidata': u'Q242874'}), dsl.way(212, wkt_loads('POINT (139.400251 34.737515)'), {'id': u'1632465089', 'name': u'大島町', 'name:en': u'Oshima', 'place': u'town', 'population': u'7884', 'wikidata': u'Q1204507'}), dsl.way(213, wkt_loads('POINT (138.881738 35.21843)'), {'id': u'1648713724', 'name': u'裾野市', 'name:en': u'Susono', 'place': u'city', 'population': u'52113', 'wikidata': u'Q847577'}), dsl.way(214, wkt_loads('POINT (138.807828 35.487457)'), {'id': u'1670542925', 'name': u'富士吉田市', 'name:en': u'Fujiyoshida', 'place': u'city', 'population': u'48167', 'wikidata': u'Q647508'}), dsl.way(215, wkt_loads('POINT (138.765304 35.501065)'), {'id': u'1670542927', 'name': u'富士河口湖町', 'name:en': u'Fujikawaguchiko', 'place': u'town', 'population': u'25329', 'wikidata': u'Q1004231'}), dsl.way(216, wkt_loads('POINT (139.519089 35.752546)'), {'id': u'1673414219', 'name': u'東久留米市', 'name:en': u'Higashikurume', 'place': u'city', 'population': u'116566', 'wikidata': u'Q317830'}), dsl.way(217, wkt_loads('POINT (139.484539 35.768929)'), {'id': u'1673414230', 'name': u'東村山市', 'name:en': u'Higashimurayama', 'place': u'city', 'population': u'150116', 'wikidata': u'Q240489'}), dsl.way(218, wkt_loads('POINT (139.531253 35.785483)'), {'id': u'1673414233', 'name': u'清瀬市', 'name:en': u'Kiyose', 'place': u'city', 'population': u'75072', 'wikidata': u'Q329754'}), dsl.way(219, wkt_loads('POINT (140.050178 35.911532)'), {'id': u'1699286306', 'name': u'取手市', 'name:en': u'Toride', 'place': u'city', 'population': u'105447', 'wikidata': u'Q638312'}), dsl.way(220, wkt_loads('POINT (139.428831 35.740869000000004)'), {'id': u'1717099673', 'name': u'東大和市', 'name:en': u'Higashiyamato', 'place': u'city', 'population': u'84876', 'wikidata': u'Q390788'}), dsl.way(221, wkt_loads('POINT (138.63805 35.639933)'), {'id': u'1775025907', 'name': u'山梨県', 'name:en': u'Yamanashi Prefecture', 'place': u'province', 'wikidata': u'Q132720'}), dsl.way(222, wkt_loads('POINT (138.146936 34.647956)'), {'id': u'1788105973', 'name': u'御前崎市', 'name:en': u'Omaezaki', 'place': u'city', 'population': u'31894', 'wikidata': u'Q850380'}), dsl.way(223, wkt_loads('POINT (138.18517 34.718766)'), {'id': u'1788105974', 'name': u'牧之原市', 'name:en': u'Makinohara', 'place': u'city', 'population': u'44493', 'wikidata': u'Q850527'}), dsl.way(224, wkt_loads('POINT (138.392164 35.837156)'), {'id': u'1788978271', 'name': u'北杜市', 'name:en': u'Hokuto', 'place': u'city', 'population': u'44314', 'wikidata': u'Q825272'}), dsl.way(225, wkt_loads('POINT (138.362783 35.404554)'), {'id': u'1796938439', 'name': u'早川町', 'name:en': u'Hayakawa', 'place': u'town', 'population': u'1068', 'wikidata': u'Q1204436'}), dsl.way(226, wkt_loads('POINT (138.571044 35.665248)'), {'capital': u'4', 'id': u'1808192270', 'name': u'甲府市', 'name:en': u'Kofu', 'place': u'city', 'population': u'193125', 'wikidata': u'Q201932'}), dsl.way(227, wkt_loads('POINT (138.687126 35.692845)'), {'id': u'1808377239', 'name': u'山梨市', 'name:en': u'Yamanashi', 'place': u'city', 'population': u'33962', 'wikidata': u'Q840610'}), dsl.way(228, wkt_loads('POINT (138.464989 35.608362)'), {'id': u'1809487734', 'name': u'南アルプス市', 'name:en': u'Minami-Alps', 'place': u'city', 'population': u'70116', 'wikidata': u'Q824000'}), dsl.way(229, wkt_loads('POINT (138.409373 35.717518)'), {'id': u'1809498177', 'name': u'韮崎市', 'name:en': u'Nirasaki', 'place': u'city', 'population': u'30070', 'wikidata': u'Q290326'}), dsl.way(230, wkt_loads('POINT (138.515327 35.668167)'), {'id': u'1810109727', 'name': u'甲斐市', 'name:en': u'Kai', 'place': u'city', 'population': u'74705', 'wikidata': u'Q577309'}), dsl.way(231, wkt_loads('POINT (138.639399 35.648547)'), {'id': u'1812111051', 'name': u'笛吹市', 'name:en': u'Fuefuki', 'place': u'city', 'population': u'68641', 'wikidata': u'Q849434'}), dsl.way(232, wkt_loads('POINT (138.520992 35.589199)'), {'id': u'1812278654', 'name': u'中央市', 'name:en': u'Chuo', 'place': u'city', 'population': u'30837', 'wikidata': u'Q666049'}), dsl.way(233, wkt_loads('POINT (139.702801 35.530531)'), {'id': u'1933981790', 'name': u'川崎市', 'name:en': u'Kawasaki', 'place': u'city', 'population': u'1509887', 'wikidata': u'Q164234'}), dsl.way(234, wkt_loads('POINT (139.636768 35.444991)'), {'capital': u'4', 'id': u'1973500311', 'name': u'横浜市', 'name:en': u'Yokohama', 'place': u'city', 'population': u'3708122', 'wikidata': u'Q38283'}), dsl.way(235, wkt_loads('POINT (139.869984 34.99653)'), {'id': u'1977624221', 'name': u'館山市', 'name:en': u'Tateyama', 'place': u'city', 'population': u'46471', 'wikidata': u'Q646755'}), dsl.way(236, wkt_loads('POINT (139.83714 35.038749)'), {'id': u'1977631144', 'name': u'南房総市', 'name:en': u'Minamiboso', 'place': u'city', 'population': u'37765', 'wikidata': u'Q873521'}), dsl.way(237, wkt_loads('POINT (139.835819 35.111102)'), {'id': u'1977633118', 'name': u'鋸南町', 'name:en': u'Kyonan', 'place': u'town', 'population': u'8022', 'wikidata': u'Q1203580'}), dsl.way(238, wkt_loads('POINT (140.098692 35.114058)'), {'id': u'1977635153', 'name': u'鴨川市', 'name:en': u'Kamogawa', 'place': u'city', 'population': u'33932', 'wikidata': u'Q387211'}), dsl.way(239, wkt_loads('POINT (139.85705 35.303915)'), {'id': u'1977637091', 'name': u'富津市', 'name:en': u'Futtsu', 'place': u'city', 'population': u'44449', 'wikidata': u'Q498023'}), dsl.way(240, wkt_loads('POINT (140.24526 35.284792)'), {'id': u'1977639950', 'name': u'大多喜町', 'name:en': u'Otaki', 'place': u'town', 'population': u'9843', 'wikidata': u'Q1346191'}), dsl.way(241, wkt_loads('POINT (140.348777 35.191661)'), {'id': u'1977643116', 'name': u'御宿町', 'name:en': u'Onjuku', 'place': u'town', 'population': u'7315'}), dsl.way(242, wkt_loads('POINT (140.320745 35.152185)'), {'id': u'1977652858', 'name': u'勝浦市', 'name:en': u'Katsuura', 'place': u'city', 'population': u'17808', 'wikidata': u'Q696418'}), dsl.way(243, wkt_loads('POINT (140.664575 35.8899)'), {'id': u'2016860246', 'name': u'神栖市', 'name:en': u'Kamisu', 'place': u'city', 'population': u'95052', 'wikidata': u'Q840595'}), dsl.way(244, wkt_loads('POINT (138.09554 34.933249000000004)'), {'id': u'2035767441', 'name': u'静岡県', 'name:en': u'Shizuoka Prefecture', 'place': u'province'}), dsl.way(245, wkt_loads('POINT (139.550228 35.73546)'), {'id': u'2039121337', 'name': u'西東京市', 'name:en': u'Nishitokyo', 'place': u'city', 'population': u'202435', 'wikidata': u'Q242882'}), dsl.way(246, wkt_loads('POINT (138.859988 35.181254)'), {'id': u'2055574009', 'name': u'長泉町', 'name:en': u'Nagaizumi', 'place': u'town', 'population': u'42331', 'wikidata': u'Q1204459'}), dsl.way(247, wkt_loads('POINT (139.031616 35.222919)'), {'id': u'2055590056', 'name': u'箱根町', 'name:en': u'Hakone', 'place': u'town', 'population': u'11786', 'wikidata': u'Q671040'}), dsl.way(248, wkt_loads('POINT (140.645029 35.966116)'), {'id': u'2089866662', 'name': u'鹿嶋市', 'name:en': u'Kashima', 'place': u'city', 'population': u'67802', 'wikidata': u'Q467471'}), dsl.way(249, wkt_loads('POINT (140.411617 36.54292)'), {'id': u'2089981684', 'name': u'常陸大宮市', 'name:en': u'Hitachiomiya', 'place': u'city', 'population': u'41342', 'wikidata': u'Q838681'}), dsl.way(250, wkt_loads('POINT (140.516516 36.158565)'), {'id': u'2091799198', 'name': u'鉾田市', 'name:en': u'Hokota', 'place': u'city', 'population': u'47463', 'wikidata': u'Q857297'}), dsl.way(251, wkt_loads('POINT (140.384946 35.253939)'), {'id': u'2097936978', 'name': u'いすみ市', 'name:en': u'Isumi', 'place': u'city', 'population': u'37442', 'wikidata': u'Q840834'}), dsl.way(252, wkt_loads('POINT (140.368662 35.372802)'), {'id': u'2097955629', 'name': u'一宮町', 'name:en': u'Ichinomiya', 'place': u'town', 'population': u'11767', 'wikidata': u'Q1203602'}), dsl.way(253, wkt_loads('POINT (140.440201 35.535085)'), {'id': u'2097955691', 'name': u'九十九里町', 'name:en': u'Kujukuri', 'place': u'town', 'population': u'16510', 'wikidata': u'Q1202775'}), dsl.way(254, wkt_loads('POINT (140.224016 35.723462)'), {'id': u'2097955765', 'name': u'佐倉市', 'name:en': u'Sakura', 'place': u'city', 'population': u'171927', 'wikidata': u'Q498011'}), dsl.way(255, wkt_loads('POINT (140.099513 35.722537)'), {'id': u'2097955818', 'name': u'八千代市', 'name:en': u'Yachiyo', 'place': u'city', 'population': u'195491', 'wikidata': u'Q328651'}), dsl.way(256, wkt_loads('POINT (140.317865 35.665861)'), {'id': u'2098146218', 'name': u'八街市', 'name:en': u'Yachimata', 'place': u'city', 'population': u'69315', 'wikidata': u'Q638296'}), dsl.way(257, wkt_loads('POINT (140.564514 35.70794)'), {'id': u'2098146219', 'name': u'匝瑳市', 'name:en': u'Sosa', 'place': u'city', 'population': u'36244', 'wikidata': u'Q858367'}), dsl.way(258, wkt_loads('POINT (140.145298 35.832258)'), {'id': u'2098146277', 'name': u'印西市', 'name:en': u'Inzai', 'place': u'city', 'population': u'96640', 'wikidata': u'Q637901'}), dsl.way(259, wkt_loads('POINT (139.902551 35.330238)'), {'id': u'2098146321', 'name': u'君津市', 'name:en': u'Kimitsu', 'place': u'city', 'population': u'84221', 'wikidata': u'Q637928'}), dsl.way(260, wkt_loads('POINT (140.167945 35.669655)'), {'id': u'2098146343', 'name': u'四街道市', 'name:en': u'Yotsukaido', 'place': u'city', 'population': u'90712', 'wikidata': u'Q429373'}), dsl.way(261, wkt_loads('POINT (140.467716 35.735734)'), {'id': u'2098146346', 'name': u'多古町', 'name:en': u'Tako', 'place': u'town', 'population': u'14724', 'wikidata': u'Q1202807'}), dsl.way(262, wkt_loads('POINT (140.320893 35.521604)'), {'id': u'2098146347', 'name': u'大網白里市', 'name:en': u'Oamishirasato', 'place': u'city', 'population': u'48687', 'wikidata': u'Q1203251'}), dsl.way(263, wkt_loads('POINT (140.343055 35.726888)'), {'id': u'2098146348', 'name': u'富里市', 'name:en': u'Tomisato', 'place': u'city', 'population': u'49636', 'wikidata': u'Q692857'}), dsl.way(264, wkt_loads('POINT (140.1157 35.497775)'), {'id': u'2098146351', 'name': u'市原市', 'name:en': u'Ichihara', 'place': u'city', 'population': u'279065', 'wikidata': u'Q207881'}), dsl.way(265, wkt_loads('POINT (139.928568 35.729412)'), {'id': u'2098146352', 'name': u'市川市', 'name:en': u'Ichikawa', 'place': u'city', 'population': u'469603', 'wikidata': u'Q209785'}), dsl.way(266, wkt_loads('POINT (140.318338 35.776768)'), {'id': u'2098146368', 'name': u'成田市', 'name:en': u'Narita', 'place': u'city', 'population': u'131190', 'wikidata': u'Q273798'}), dsl.way(267, wkt_loads('POINT (140.028065 35.863999)'), {'id': u'2098146404', 'name': u'我孫子市', 'name:en': u'Abiko', 'place': u'city', 'population': u'130977', 'wikidata': u'Q243859'}), dsl.way(268, wkt_loads('POINT (140.646453 35.720413)'), {'id': u'2098146405', 'name': u'旭市', 'name:en': u'Asahi', 'place': u'city', 'population': u'65431', 'wikidata': u'Q637868'}), dsl.way(269, wkt_loads('POINT (139.91668 35.375973)'), {'id': u'2098146406', 'name': u'木更津市', 'name:en': u'Kisarazu', 'place': u'city', 'population': u'135461', 'wikidata': u'Q335427'}), dsl.way(270, wkt_loads('POINT (140.668892 35.83711)'), {'id': u'2098183328', 'name': u'東庄町', 'name:en': u'Tohnosho', 'place': u'town', 'population': u'14152', 'wikidata': u'Q1342834'}), dsl.way(271, wkt_loads('POINT (139.903177 35.787937)'), {'id': u'2098183361', 'name': u'松戸市', 'name:en': u'Matsudo', 'place': u'city', 'population': u'483480', 'wikidata': u'Q320943'}), dsl.way(272, wkt_loads('POINT (139.975688 35.867622)'), {'id': u'2098183362', 'name': u'柏市', 'name:en': u'Kashiwa', 'place': u'city', 'population': u'422385', 'wikidata': u'Q319743'}), dsl.way(273, wkt_loads('POINT (140.244124 35.841044)'), {'id': u'2098183363', 'name': u'栄町', 'name:en': u'Sakae', 'place': u'town', 'population': u'21228', 'wikidata': u'Q1202754'}), dsl.way(274, wkt_loads('POINT (140.504854 35.66582)'), {'id': u'2098183364', 'name': u'横芝光町', 'name:en': u'Yokoshibahikari', 'place': u'town', 'population': u'23762', 'wikidata': u'Q1203260'}), dsl.way(275, wkt_loads('POINT (139.902626 35.856231)'), {'id': u'2098183365', 'name': u'流山市', 'name:en': u'Nagareyama', 'place': u'city', 'population': u'186863', 'wikidata': u'Q328625'}), dsl.way(276, wkt_loads('POINT (140.056063 35.791454)'), {'id': u'2098183367', 'name': u'白井市', 'name:en': u'Shiroi', 'place': u'city', 'population': u'62374', 'wikidata': u'Q519187'}), dsl.way(277, wkt_loads('POINT (140.374253 35.454206)'), {'id': u'2098183398', 'name': u'白子町', 'name:en': u'Shirako', 'place': u'town', 'population': u'11149', 'wikidata': u'Q1203293'}), dsl.way(278, wkt_loads('POINT (140.319503 35.361086)'), {'id': u'2098183444', 'name': u'睦沢町', 'name:en': u'Mutsuzawa', 'place': u'town', 'population': u'7222', 'wikidata': u'Q768083'}), dsl.way(279, wkt_loads('POINT (140.405113 35.901689)'), {'id': u'2098183450', 'name': u'神崎町', 'name:en': u'Kozaki', 'place': u'town', 'population': u'6133', 'wikidata': u'Q1153721'}), dsl.way(280, wkt_loads('POINT (140.018956 35.670572)'), {'id': u'2098183451', 'name': u'習志野市', 'name:en': u'Narashino', 'place': u'city', 'population': u'172497', 'wikidata': u'Q318047'}), dsl.way(281, wkt_loads('POINT (139.988668 35.699997)'), {'id': u'2098183459', 'name': u'船橋市', 'name:en': u'Funabashi', 'place': u'city', 'population': u'633263', 'wikidata': u'Q271417'}), dsl.way(282, wkt_loads('POINT (140.41414 35.693098)'), {'id': u'2098183474', 'name': u'芝山町', 'name:en': u'Shibayama', 'place': u'town', 'population': u'7431', 'wikidata': u'Q1203689'}), dsl.way(283, wkt_loads('POINT (140.288075 35.428509)'), {'id': u'2098183487', 'name': u'茂原市', 'name:en': u'Mobara', 'place': u'city', 'population': u'88824', 'wikidata': u'Q502486'}), dsl.way(284, wkt_loads('POINT (139.954466 35.429669)'), {'id': u'2098215068', 'name': u'袖ケ浦市', 'name:en': u'Sodegaura', 'place': u'city', 'population': u'61639', 'wikidata': u'Q646847'}), dsl.way(285, wkt_loads('POINT (140.269483 35.724714)'), {'id': u'2098215126', 'name': u'酒々井町', 'name:en': u'Shisui', 'place': u'town', 'population': u'20955', 'wikidata': u'Q782157'}), dsl.way(286, wkt_loads('POINT (140.000715 35.776646)'), {'id': u'2098215206', 'name': u'鎌ケ谷市', 'name:en': u'Kamagaya', 'place': u'city', 'population': u'109238', 'wikidata': u'Q387365'}), dsl.way(287, wkt_loads('POINT (140.237276 35.386036)'), {'id': u'2098215241', 'name': u'長南町', 'name:en': u'Chonan', 'place': u'town', 'population': u'8206', 'wikidata': u'Q1203194'}), dsl.way(288, wkt_loads('POINT (140.227151 35.431105)'), {'id': u'2098215275', 'name': u'長柄町', 'name:en': u'Nagara', 'place': u'town', 'population': u'7337', 'wikidata': u'Q1203545'}), dsl.way(289, wkt_loads('POINT (140.499279 35.897827)'), {'id': u'2098215364', 'name': u'香取市', 'name:en': u'Katori', 'place': u'city', 'population': u'75362', 'wikidata': u'Q858357'}), dsl.way(290, wkt_loads('POINT (139.640682 35.15505)'), {'id': u'2115184095', 'name': u'三浦市', 'name:en': u'Miura', 'place': u'city', 'population': u'45289', 'wikidata': u'Q823886'}), dsl.way(291, wkt_loads('POINT (139.246756 35.300994)'), {'id': u'2115184096', 'name': u'二宮町', 'name:en': u'Ninomiya', 'place': u'town', 'population': u'28378', 'wikidata': u'Q1354853'}), dsl.way(292, wkt_loads('POINT (139.099241 35.320574)'), {'id': u'2115184099', 'name': u'南足柄市', 'name:en': u'Minamiashigara', 'place': u'city', 'population': u'43306', 'wikidata': u'Q651742'}), dsl.way(293, wkt_loads('POINT (139.323536 35.464797)'), {'id': u'2115184100', 'name': u'厚木市', 'name:en': u'Atsugi', 'place': u'city', 'population': u'225330', 'wikidata': u'Q389711'}), dsl.way(294, wkt_loads('POINT (139.156636 35.326242)'), {'id': u'2115184101', 'name': u'大井町', 'name:en': u'Oi', 'place': u'town', 'population': u'17033', 'wikidata': u'Q1202616'}), dsl.way(295, wkt_loads('POINT (139.460758 35.47269)'), {'admin_leve': u'7', 'id': u'2115184102', 'name': u'大和市', 'name:en': u'Yamato', 'place': u'city', 'population': u'232922', 'wikidata': u'Q386697'}), dsl.way(296, wkt_loads('POINT (139.289557 35.317773)'), {'id': u'2115184103', 'name': u'大磯町', 'name:en': u'Oiso', 'place': u'town', 'population': u'31550', 'wikidata': u'Q385023'}), dsl.way(297, wkt_loads('POINT (139.383785 35.372922)'), {'id': u'2115184104', 'name': u'寒川町', 'name:en': u'Samukawa', 'place': u'town', 'population': u'47936', 'wikidata': u'Q1342787'}), dsl.way(298, wkt_loads('POINT (139.150229 35.263676)'), {'id': u'2115184105', 'name': u'小田原市', 'name:en': u'Odawara', 'place': u'city', 'population': u'192407', 'wikidata': u'Q267258'}), dsl.way(299, wkt_loads('POINT (139.05448 35.389492)'), {'id': u'2115184106', 'name': u'山北町', 'name:en': u'Yamakita', 'place': u'town', 'population': u'10724', 'wikidata': u'Q370478'}), dsl.way(300, wkt_loads('POINT (139.318278 35.357674)'), {'id': u'2115184107', 'name': u'平塚市', 'name:en': u'Hiratsuka', 'place': u'city', 'population': u'259698', 'wikidata': u'Q502199'}), dsl.way(301, wkt_loads('POINT (139.133926 35.359236)'), {'id': u'2115184110', 'name': u'松田町', 'name:en': u'Matsuda', 'place': u'town', 'population': u'11171', 'wikidata': u'Q1202796'}), dsl.way(302, wkt_loads('POINT (139.665383 35.273056)'), {'id': u'2115184112', 'name': u'横須賀市', 'name:en': u'Yokosuka', 'place': u'city', 'population': u'406586', 'wikidata': u'Q200578'}), dsl.way(303, wkt_loads('POINT (139.12073 35.166784)'), {'id': u'2115184115', 'name': u'湯河原町', 'name:en': u'Yugawara', 'place': u'town', 'population': u'25026', 'wikidata': u'Q532346'}), dsl.way(304, wkt_loads('POINT (139.13462 35.160373)'), {'id': u'2115184117', 'name': u'真鶴町', 'name:en': u'Manazuru', 'place': u'town', 'population': u'7333', 'wikidata': u'Q1202786'}), dsl.way(305, wkt_loads('POINT (139.430823 35.446048)'), {'admin_leve': u'7', 'id': u'2115184119', 'name': u'綾瀬市', 'name:en': u'Ayase', 'place': u'city', 'population': u'84139', 'wikidata': u'Q792819'}), dsl.way(306, wkt_loads('POINT (139.405371 35.329479)'), {'id': u'2115184120', 'name': u'茅ヶ崎市', 'name:en': u'Chigasaki', 'place': u'city', 'population': u'240618', 'wikidata': u'Q633911'}), dsl.way(307, wkt_loads('POINT (139.593177 35.272909)'), {'id': u'2115184121', 'name': u'葉山町', 'name:en': u'Hayama', 'place': u'town', 'population': u'32096', 'wikidata': u'Q1342807'}), dsl.way(308, wkt_loads('POINT (139.465077 35.364842)'), {'id': u'2115184122', 'name': u'藤沢市', 'name:en': u'Fujisawa', 'place': u'city', 'population': u'428837', 'wikidata': u'Q386661'}), dsl.way(309, wkt_loads('POINT (139.583845 35.304067)'), {'id': u'2115184123', 'name': u'逗子市', 'name:en': u'Zushi', 'place': u'city', 'population': u'57425', 'wikidata': u'Q230843'}), dsl.way(310, wkt_loads('POINT (139.54442 35.329564)'), {'id': u'2115184125', 'name': u'鎌倉市', 'name:en': u'Kamakura', 'place': u'city', 'population': u'172284', 'wikidata': u'Q200267'}), dsl.way(311, wkt_loads('POINT (139.420453 35.499205)'), {'id': u'2115186706', 'name': u'座間市', 'name:en': u'Zama', 'place': u'city', 'population': u'128737', 'wikidata': u'Q145333'}), dsl.way(312, wkt_loads('POINT (139.297795 35.532347)'), {'id': u'2115186707', 'name': u'愛川町', 'name:en': u'Aikawa', 'place': u'town', 'population': u'40343', 'wikidata': u'Q1203267'}), dsl.way(313, wkt_loads('POINT (139.389999 35.419984)'), {'id': u'2115186708', 'name': u'海老名市', 'name:en': u'Ebina', 'place': u'city', 'population': u'130678', 'wikidata': u'Q734390'}), dsl.way(314, wkt_loads('POINT (139.236215 35.56559)'), {'id': u'2115186710', 'name': u'相模原市', 'name:en': u'Sagamihara', 'place': u'city', 'population': u'722157', 'wikidata': u'Q209779'}), dsl.way(315, wkt_loads('POINT (140.555282 35.947173)'), {'id': u'2115199905', 'name': u'潮来市', 'name:en': u'Itako', 'place': u'city', 'population': u'28491', 'wikidata': u'Q840598'}), dsl.way(316, wkt_loads('POINT (140.488883 35.99019)'), {'id': u'2115199906', 'name': u'行方市', 'name:en': u'Namekata', 'place': u'city', 'population': u'33914', 'wikidata': u'Q877184'}), dsl.way(317, wkt_loads('POINT (140.036995 35.963014)'), {'id': u'2115840208', 'name': u'つくばみらい市', 'name:en': u'Tsukubamirai', 'place': u'city', 'population': u'50615', 'wikidata': u'Q877254'}), dsl.way(318, wkt_loads('POINT (139.745812 36.114738)'), {'id': u'2115840209', 'name': u'五霞町', 'name:en': u'Goka', 'place': u'town', 'population': u'8786', 'wikidata': u'Q680056'}), dsl.way(319, wkt_loads('POINT (139.889662 36.048481)'), {'id': u'2115840210', 'name': u'坂東市', 'name:en': u'Bando', 'place': u'city', 'population': u'53242', 'wikidata': u'Q583931'}), dsl.way(320, wkt_loads('POINT (139.795198 36.108379)'), {'id': u'2115840211', 'name': u'境町', 'name:en': u'Sakai', 'place': u'town', 'population': u'24517', 'wikidata': u'Q1203337'}), dsl.way(321, wkt_loads('POINT (139.975498 35.95101)'), {'id': u'2115840213', 'name': u'守谷市', 'name:en': u'Moriya', 'place': u'city', 'population': u'66230', 'wikidata': u'Q840608'}), dsl.way(322, wkt_loads('POINT (139.874867 35.954908)'), {'id': u'2115840215', 'name': u'野田市', 'name:en': u'Noda', 'place': u'city', 'population': u'152916', 'wikidata': u'Q328619'}), dsl.way(323, wkt_loads('POINT (138.945379 34.679545)'), {'id': u'2377927287', 'name': u'下田市', 'name:en': u'Shimoda', 'place': u'city', 'population': u'22007', 'wikidata': u'Q653402'}), dsl.way(324, wkt_loads('POINT (139.087685 34.926734)'), {'id': u'2377927288', 'name': u'伊東市', 'name:en': u'Ito', 'place': u'city', 'population': u'66988', 'wikidata': u'Q721163'}), dsl.way(325, wkt_loads('POINT (138.961915 35.035531)'), {'id': u'2377927289', 'name': u'伊豆の国市', 'name:en': u'Izunokuni', 'place': u'city', 'population': u'47624', 'wikidata': u'Q863758'}), dsl.way(326, wkt_loads('POINT (138.946708 34.976455)'), {'id': u'2377927290', 'name': u'伊豆市', 'name:en': u'Izu', 'place': u'city', 'population': u'30283', 'wikidata': u'Q696840'}), dsl.way(327, wkt_loads('POINT (138.998583 35.117085)'), {'id': u'2377927291', 'name': u'函南町', 'name:en': u'Kannami', 'place': u'town', 'population': u'37347', 'wikidata': u'Q1203533'}), dsl.way(328, wkt_loads('POINT (138.858719 34.643311)'), {'id': u'2377927292', 'name': u'南伊豆町', 'name:en': u'Minamiizu', 'place': u'town', 'population': u'8524', 'wikidata': u'Q1203741'}), dsl.way(329, wkt_loads('POINT (139.035878 34.801476)'), {'id': u'2377927293', 'name': u'東伊豆町', 'name:en': u'Higashiizu', 'place': u'town', 'population': u'12624', 'wikidata': u'Q304491'}), dsl.way(330, wkt_loads('POINT (138.801992 34.750811)'), {'id': u'2377927294', 'name': u'松崎町', 'name:en': u'Matsuzaki', 'place': u'town', 'population': u'6837', 'wikidata': u'Q1204017'}), dsl.way(331, wkt_loads('POINT (138.983947 34.750862)'), {'id': u'2377927295', 'name': u'河津町', 'name:en': u'Kawazu', 'place': u'town', 'population': u'7303', 'wikidata': u'Q1203861'}), dsl.way(332, wkt_loads('POINT (138.898974 35.10764)'), {'id': u'2377927296', 'name': u'清水町', 'name:en': u'Shimizu', 'place': u'town', 'population': u'32118', 'wikidata': u'Q1203168'}), dsl.way(333, wkt_loads('POINT (139.059891 35.08992)'), {'id': u'2377927299', 'name': u'熱海市', 'name:en': u'Atami', 'place': u'city', 'population': u'37000', 'wikidata': u'Q653364'}), dsl.way(334, wkt_loads('POINT (138.794672 34.800667)'), {'id': u'2377927313', 'name': u'西伊豆町', 'name:en': u'Nishiizu', 'place': u'town', 'population': u'8234', 'wikidata': u'Q1203949'}), dsl.way(335, wkt_loads('POINT (139.703632 35.693763)'), {'capital': u'4', 'id': u'2389061853', 'name': u'新宿区', 'name:en': u'Shinjuku', 'place': u'city', 'population': u'337556', 'wikidata': u'Q179645'}), dsl.way(336, wkt_loads('POINT (139.677099 36.018618)'), {'id': u'2716991002', 'name': u'白岡市', 'name:en': u'Shiraoka', 'place': u'city', 'population': u'52109', 'wikidata': u'Q1345322'}), dsl.way(337, wkt_loads('POINT (139.374753 35.434294)'), {'admin_leve': u'4', 'id': u'2719205431', 'name': u'神奈川県', 'name:en': u'Kanagawa Prefecture', 'place': u'province'}), dsl.way(338, wkt_loads('POINT (140.26473 35.549399)'), {'id': u'2739381522', 'name': u'千葉県', 'name:en': u'Chiba Prefecture', 'place': u'province'}), dsl.way(339, wkt_loads('POINT (139.90185 35.653052)'), {'id': u'2900447873', 'name': u'浦安市', 'name:en': u'Urayasu', 'place': u'city', 'population': u'164024', 'wikidata': u'Q319729'}), dsl.way(340, wkt_loads('POINT (138.461389 35.561111)'), {'id': u'2955593366', 'name': u'富士川町', 'name:en': u'Fujikawa', 'place': u'town', 'population': u'15294', 'wikidata': u'Q1351723'}), dsl.way(341, wkt_loads('POINT (138.502222 35.565278)'), {'id': u'2955593367', 'name': u'市川三郷町', 'name:en': u'Ichikawamisato', 'place': u'town', 'population': u'15673', 'wikidata': u'Q1204453'}), dsl.way(342, wkt_loads('POINT (138.538955 35.625669)'), {'id': u'2955593368', 'name': u'昭和町', 'name:en': u'Showa', 'place': u'town', 'population': u'19505', 'wikidata': u'Q1204276'}), dsl.way(343, wkt_loads('POINT (138.458633 35.259129)'), {'id': u'2993187421', 'name': u'南部町', 'name:en': u'Nanbu', 'place': u'town', 'population': u'8067', 'wikidata': u'Q1204802'}), dsl.way(344, wkt_loads('POINT (138.442567 35.468051)'), {'id': u'2993187422', 'name': u'身延町', 'name:en': u'Minobu', 'place': u'town', 'population': u'12669', 'wikidata': u'Q1204435'}), dsl.way(345, wkt_loads('POINT (139.120733 35.342161)'), {'id': u'2993187423', 'name': u'開成町', 'name:en': u'Kaisei', 'place': u'town', 'population': u'17013', 'wikidata': u'Q1202613'}), dsl.way(346, wkt_loads('POINT (138.887831 36.326365)'), {'id': u'3231770610', 'name': u'安中市', 'name:en': u'Annaka', 'place': u'city', 'population': u'57097', 'wikidata': u'Q564234'}), dsl.way(347, wkt_loads('POINT (139.891043 36.181575)'), {'id': u'3369490337', 'name': u'八千代町', 'name:en': u'Yachiyo', 'place': u'town', 'population': u'22021', 'wikidata': u'Q1203394'}), dsl.way(348, wkt_loads('POINT (140.244626 35.884548)'), {'id': u'3369514735', 'name': u'河内町', 'name:en': u'Kawachi', 'place': u'town', 'population': u'9168', 'wikidata': u'Q1203304'}), dsl.way(349, wkt_loads('POINT (140.138754 35.857362)'), {'id': u'3372718846', 'name': u'利根町', 'name:en': u'Tone', 'place': u'town', 'population': u'16313', 'wikidata': u'Q1203324'}), dsl.way(350, wkt_loads('POINT (140.090359 36.327241)'), {'id': u'3383889945', 'name': u'桜川市', 'name:en': u'Sakuragawa', 'place': u'city', 'population': u'41278', 'wikidata': u'Q990350'}), dsl.way(351, wkt_loads('POINT (139.97909 36.305194)'), {'id': u'3385454595', 'name': u'筑西市', 'name:en': u'Chikusei', 'place': u'city', 'population': u'102242', 'wikidata': u'Q694322'}), dsl.way(352, wkt_loads('POINT (138.793924 35.726318)'), {'id': u'3457555438', 'name': u'甲州市', 'name:en': u'Koshu', 'place': u'city', 'population': u'30818', 'wikidata': u'Q248723'}), dsl.way(353, wkt_loads('POINT (139.220648 35.334473)'), {'id': u'3655646708', 'name': u'中井町', 'name:en': u'Nakai', 'place': u'town', 'population': u'9679', 'wikidata': u'Q1344396'}), dsl.way(354, wkt_loads('POINT (140.118126 35.609985)'), {'admin_leve': u'7', 'capital': u'4', 'id': u'3675848658', 'name': u'千葉市', 'name:en': u'Chiba', 'place': u'city', 'population': u'975140', 'wikidata': u'Q170616'}), dsl.way(355, wkt_loads('POINT (140.413429 35.602875)'), {'admin_leve': u'7', 'id': u'3675848659', 'name': u'山武市', 'name:en': u'Sanmu', 'place': u'city', 'population': u'50801', 'wikidata': u'Q873528'}), dsl.way(356, wkt_loads('POINT (140.366259 35.560031)'), {'admin_leve': u'7', 'id': u'3675848660', 'name': u'東金市', 'name:en': u'Toogane', 'place': u'city', 'population': u'60051', 'wikidata': u'Q637913'}), dsl.way(357, wkt_loads('POINT (138.120123 36.533698)'), {'id': u'5901282249', 'name': u'千曲市', 'name:en': u'Chikuma', 'place': u'city', 'population': u'59792', 'wikidata': u'Q179757'}), dsl.way(358, wkt_loads('POINT (138.249051 36.402119)'), {'id': u'5901282250', 'name': u'上田市', 'name:en': u'Ueda', 'place': u'city', 'population': u'156980', 'wikidata': u'Q844852'}), dsl.way(359, wkt_loads('POINT (138.179637 36.461702)'), {'id': u'5901282255', 'name': u'坂城町', 'name:en': u'Sakaki', 'place': u'town', 'population': u'14871', 'wikidata': u'Q1348962'}), dsl.way(360, wkt_loads('POINT (138.47677 36.248801)'), {'id': u'5901282261', 'name': u'佐久市', 'name:en': u'Saku', 'place': u'city', 'population': u'98652', 'wikidata': u'Q495821'}), dsl.way(361, wkt_loads('POINT (138.315903 36.272034)'), {'id': u'5901282274', 'name': u'立科町', 'name:en': u'Tateshina', 'place': u'town', 'population': u'7265', 'wikidata': u'Q1346895'}), dsl.way(362, wkt_loads('POINT (138.330535 36.359423)'), {'id': u'5901282279', 'name': u'東御市', 'name:en': u'Tomi', 'place': u'city', 'population': u'29601', 'wikidata': u'Q840859'}), dsl.way(363, wkt_loads('POINT (138.507163 36.322601)'), {'id': u'5901282281', 'name': u'御代田町', 'name:en': u'Miyota', 'place': u'town', 'population': u'15184', 'wikidata': u'Q1204123'}), dsl.way(364, wkt_loads('POINT (138.596997 36.348294)'), {'id': u'5901282594', 'name': u'軽井沢町', 'name:en': u'Karuizawa', 'place': u'town', 'population': u'18994', 'wikidata': u'Q1012064'}), dsl.way(365, wkt_loads('POINT (139.677875 36.239633)'), {'admin_leve': u'6', 'id': u'6914872836', 'name': u'渡良瀬遊水地', 'name:en': u'Watarase Usuichi', 'place': u'town'}), dsl.way(366, wkt_loads('POINT (139.600792 36.22589)'), {'id': u'7134809975', 'name': u'板倉町', 'name:en': u'Itakura', 'place': u'town', 'population': u'15015', 'wikidata': u'Q1203771'}), dsl.way(367, wkt_loads('POINT (139.242073 35.374662)'), {'id': u'7159778006', 'name': u'秦野市', 'name:en': u'Hadano', 'place': u'city', 'population': u'167378', 'wikidata': u'Q460806'}), dsl.way(368, wkt_loads('POINT (139.299611 35.402397)'), {'id': u'7159778007', 'name': u'伊勢原市', 'name:en': u'Isehara', 'place': u'city', 'population': u'101514', 'wikidata': u'Q734520'}), dsl.way(369, wkt_loads('POINT (139.402905 35.957231)'), {'id': u'7165933146', 'name': u'坂戸市', 'name:en': u'Sakado', 'place': u'city', 'population': u'101679', 'wikidata': u'Q850344'}), dsl.way(370, wkt_loads('POINT (139.54848 36.172402)'), {'id': u'7165933147', 'name': u'羽生市', 'name:en': u'Hanyu', 'place': u'city', 'population': u'54874', 'wikidata': u'Q847565'}), dsl.way(371, wkt_loads('POINT (139.461421 36.252976)'), {'id': u'7180044893', 'name': u'邑楽町', 'name:en': u'Ora', 'place': u'town', 'population': u'26426', 'wikidata': u'Q656774'}), dsl.way(372, wkt_loads('POINT (139.851833 36.395081)'), {'id': u'7180482856', 'name': u'下野市', 'name:en': u'Shimotsuke', 'place': u'city', 'population': u'59431', 'wikidata': u'Q851804'}), dsl.way(373, wkt_loads('POINT (140.149403 35.979425)'), {'id': u'7180482857', 'name': u'牛久市', 'name:en': u'Ushiku', 'place': u'city', 'population': u'84317', 'wikidata': u'Q844133'}), dsl.way(374, wkt_loads('POINT (139.745246 36.567292)'), {'id': u'7319384467', 'name': u'鹿沼市', 'name:en': u'Kanuma', 'place': u'city', 'population': u'97145', 'wikidata': u'Q390792'}), dsl.way(375, wkt_loads('POINT (138.425972 36.327253)'), {'id': u'7844841591', 'name': u'小諸市', 'name:en': u'Komoro', 'place': u'city', 'population': u'41693', 'wikidata': u'Q838657'})] # noqa + self.generate_fixtures(*ways) + + def test_thinned_tokyo(self): + # Zoom 8 should have Tokyo + self.assert_has_feature( + 8, 227, 100, 'places', + {'kind': 'locality', 'id': 4}) + # ... but should not have the nearby small locality Chiyoda + self.assert_no_matching_feature( + 8, 227, 100, 'places', + {'kind': 'locality', 'id': 143}) + # We should thin out most of the data at zoom 8 + self.assert_n_matching_features( + 8, 227, 100, 'places', + {'kind': 'locality'}, 134) + + # Zoom 11 should have Tokyo + self.assert_has_feature( + 11, 1819, 806, 'places', + {'kind': 'locality', 'id': 4}) + # .. and SHOULD have the nearby small locality Chiyoda + self.assert_has_feature( + 11, 1819, 806, 'places', + {'kind': 'locality', 'id': 143}) diff --git a/queries.yaml b/queries.yaml index 456e7ba87..97d08562d 100644 --- a/queries.yaml +++ b/queries.yaml @@ -972,6 +972,45 @@ post_process: items_matching: kind: station rank_key: kind_tile_rank + - fn: vectordatasource.transform.keep_n_features_gridded + params: + source_layer: places + start_zoom: 8 + end_zoom: 9 + items_matching: { kind: locality } + max_items: 1 + grid_width: 3 + sorting_keys: + - { sort_key: 'min_zoom', reverse: False } + - { sort_key: 'collision_rank', reverse: False } + - { sort_key: 'population', reverse: True } + - { sort_key: 'id', reverse: True } + - fn: vectordatasource.transform.keep_n_features_gridded + params: + source_layer: places + start_zoom: 9 + end_zoom: 11 + items_matching: { kind: locality } + max_items: 1 + grid_width: 6 + sorting_keys: + - { sort_key: 'min_zoom', reverse: False } + - { sort_key: 'collision_rank', reverse: False } + - { sort_key: 'population', reverse: True } + - { sort_key: 'id', reverse: True } + - fn: vectordatasource.transform.keep_n_features_gridded + params: + source_layer: places + start_zoom: 11 + end_zoom: 13 + items_matching: { kind: locality } + max_items: 1 + grid_width: 12 + sorting_keys: + - { sort_key: 'min_zoom', reverse: False } + - { sort_key: 'collision_rank', reverse: False } + - { sort_key: 'population', reverse: True } + - { sort_key: 'id', reverse: True } - fn: vectordatasource.transform.rank_features params: source_layer: places @@ -1071,7 +1110,7 @@ post_process: - sidewalk_right - sport - trail_visibility - + # drop name and other properties on early paths to # allow more line merging (use walking network for labeling) - fn: vectordatasource.transform.drop_properties @@ -1164,7 +1203,7 @@ post_process: - access - osm_relation where: >- - (kind == 'highway' and zoom < 11) or + (kind == 'highway' and zoom < 11) or (kind_detail == 'trunk' and zoom < 12) or (kind_detail == 'primary' and zoom < 13) or (kind_detail == 'secondary' and zoom < 14) or @@ -1278,7 +1317,7 @@ post_process: properties: - surface where: >- - kind == 'minor_road' or + kind == 'minor_road' or (kind == 'path' and zoom < 13) # drop to get better merging at mid zooms. @@ -1712,7 +1751,7 @@ post_process: - landuse_kind where: >- landuse_kind in ('residential', 'industrial') - + - fn: vectordatasource.transform.drop_properties params: source_layer: roads diff --git a/test/test_transform.py b/test/test_transform.py index 6802e8b49..6dc64bc76 100644 --- a/test/test_transform.py +++ b/test/test_transform.py @@ -395,6 +395,292 @@ def test_short_name(self): self.assertEquals('foo', props['name:short']) +class KeepNGriddedTest(unittest.TestCase): + longMessage=True + + def test_not_points(self): + from tilequeue.process import Context + import shapely.geometry + + test_shape_1 = shapely.geometry.Polygon( + [(1, 1), (2, 2), (1, 2), (1, 1)]) + test_shape_2 = shapely.geometry.Polygon( + [(10, 10), (20, 20), (10, 20), (10, 10)]) + features = [ + (test_shape_1, {"foo": "bar"}, "test_shape_1"), + (test_shape_2, {"foo": "bar"}, "test_shape_2"), + ] + feature_layer = dict( + features=features, + layer_datum=dict(name='test_layer'), + ) + feature_layers = [feature_layer] + bounds = (0, 0, 100, 100) + ctx = Context( + feature_layers=feature_layers, + nominal_zoom=0, + unpadded_bounds=bounds, + params=dict( + source_layer="test_layer", + items_matching=dict(foo="bar"), + max_items=1, + grid_width=2, + sorting_keys=[ + {"sort_key": "foo"}, + ], + ), + resources=None, + log=None, + ) + from vectordatasource.transform import keep_n_features_gridded + layer = keep_n_features_gridded(ctx) + output_features = layer['features'] + self.assertEquals(features, output_features, "Non-point features should pass through without modification") + + def test_points_keep_1(self): + from tilequeue.process import Context + import shapely.geometry + + test_shape_1 = shapely.geometry.Point((1.1, 1.0)) + test_shape_2 = shapely.geometry.Point((1.1, 1.0)) + features = [ + (test_shape_1, {"foo": "bar"}, "test_shape_1"), + (test_shape_2, {"foo": "bar"}, "test_shape_2"), + ] + feature_layer = dict( + features=features, + layer_datum=dict(name='test_layer'), + ) + feature_layers = [feature_layer] + bounds = (0, 0, 100, 100) + ctx = Context( + feature_layers=feature_layers, + nominal_zoom=0, + unpadded_bounds=bounds, + params=dict( + source_layer="test_layer", + items_matching=dict(foo="bar"), + max_items=1, + grid_width=2, + sorting_keys=[ + {"sort_key": "foo"}, + ], + ), + resources=None, + log=None, + ) + from vectordatasource.transform import keep_n_features_gridded + layer = keep_n_features_gridded(ctx) + output_features = layer['features'] + self.assertEqual(1, len(output_features), "Should consolidate to a single point in the bucket") + self.assertEqual("test_shape_1", output_features[0][2], "All values equal, should pick first one") + + def test_points_keep_1_multisort_second(self): + from tilequeue.process import Context + import shapely.geometry + + test_shape_1 = shapely.geometry.Point((1.1, 1.0)) + test_shape_2 = shapely.geometry.Point((1.1, 1.0)) + features = [ + (test_shape_2, {"foo": "bar", "min_zoom": 12.0, "population": 20000}, "test_shape_2"), + (test_shape_1, {"foo": "bar", "min_zoom": 12.0, "population": 10000}, "test_shape_1"), + ] + feature_layer = dict( + features=features, + layer_datum=dict(name='test_layer'), + ) + feature_layers = [feature_layer] + bounds = (0, 0, 100, 100) + ctx = Context( + feature_layers=feature_layers, + nominal_zoom=0, + unpadded_bounds=bounds, + params=dict( + source_layer="test_layer", + items_matching=dict(foo="bar"), + max_items=1, + grid_width=2, + sorting_keys=[ + {"sort_key": "min_zoom"}, + {"sort_key": "population", "reverse": True}, + ], + ), + resources=None, + log=None, + ) + from vectordatasource.transform import keep_n_features_gridded + layer = keep_n_features_gridded(ctx) + output_features = layer['features'] + self.assertEqual(1, len(output_features), "Should consolidate to a single point in the bucket") + self.assertEqual("test_shape_2", output_features[0][2], "Should pick the shape with higher population") + + def test_points_keep_1_multisort_minzoom(self): + from tilequeue.process import Context + import shapely.geometry + + test_shape_1 = shapely.geometry.Point((1.1, 1.0)) + test_shape_2 = shapely.geometry.Point((1.1, 1.0)) + features = [ + (test_shape_2, {"foo": "bar", "min_zoom": 12.0, "population": 20000}, "test_shape_2"), + (test_shape_1, {"foo": "bar", "min_zoom": 10.0, "population": 10000}, "test_shape_1"), + ] + feature_layer = dict( + features=features, + layer_datum=dict(name='test_layer'), + ) + feature_layers = [feature_layer] + bounds = (0, 0, 100, 100) + ctx = Context( + feature_layers=feature_layers, + nominal_zoom=0, + unpadded_bounds=bounds, + params=dict( + source_layer="test_layer", + items_matching=dict(foo="bar"), + max_items=1, + grid_width=2, + sorting_keys=[ + {"sort_key": "min_zoom"}, + {"sort_key": "population", "reverse": True}, + ], + ), + resources=None, + log=None, + ) + from vectordatasource.transform import keep_n_features_gridded + layer = keep_n_features_gridded(ctx) + output_features = layer['features'] + self.assertEqual(1, len(output_features), "Should consolidate to a single point in the bucket") + self.assertEqual("test_shape_1", output_features[0][2], "Should pick the shape with lower min_zoom") + + def test_points_keep_1_different_buckets(self): + from tilequeue.process import Context + import shapely.geometry + + test_shape_1 = shapely.geometry.Point((1.0, 1.0)) + test_shape_2 = shapely.geometry.Point((1.0, 1.0)) + test_shape_3 = shapely.geometry.Point((75.0, 75.0)) + test_shape_4 = shapely.geometry.Point((25.0, 75.0)) + features = [ + (test_shape_1, {"foo": "bar", "population": 1000}, "test_shape_1"), + (test_shape_2, {"foo": "bar", "population": 2000}, "test_shape_2"), + (test_shape_3, {"foo": "bar", "population": 3000}, "test_shape_3"), + (test_shape_4, {"foo": "bar", "population": 4000}, "test_shape_4"), + ] + feature_layer = dict( + features=features, + layer_datum=dict(name='test_layer'), + ) + feature_layers = [feature_layer] + bounds = (0, 0, 100, 100) + ctx = Context( + feature_layers=feature_layers, + nominal_zoom=0, + unpadded_bounds=bounds, + params=dict( + source_layer="test_layer", + items_matching=dict(foo="bar"), + max_items=1, + grid_width=2, + sorting_keys=[ + {"sort_key": "population", "reverse": True}, + ], + ), + resources=None, + log=None, + ) + from vectordatasource.transform import keep_n_features_gridded + layer = keep_n_features_gridded(ctx) + output_features = layer['features'] + self.assertEqual(3, len(output_features), "Should consolidate to 3 points") + self.assertEqual("test_shape_4", output_features[0][2]) + self.assertEqual("test_shape_2", output_features[1][2]) + self.assertEqual("test_shape_3", output_features[2][2]) + + def test_points_keep_more_than_in_one_bucket(self): + from tilequeue.process import Context + import shapely.geometry + + test_shape_1 = shapely.geometry.Point((1.0, 1.0)) + test_shape_2 = shapely.geometry.Point((1.0, 1.0)) + test_shape_3 = shapely.geometry.Point((75.0, 75.0)) + test_shape_4 = shapely.geometry.Point((25.0, 75.0)) + features = [ + (test_shape_1, {"foo": "bar", "population": 1000}, "test_shape_1"), + (test_shape_2, {"foo": "bar", "population": 2000}, "test_shape_2"), + (test_shape_3, {"foo": "bar", "population": 3000}, "test_shape_3"), + (test_shape_4, {"foo": "bar", "population": 4000}, "test_shape_4"), + ] + feature_layer = dict( + features=features, + layer_datum=dict(name='test_layer'), + ) + feature_layers = [feature_layer] + bounds = (0, 0, 100, 100) + ctx = Context( + feature_layers=feature_layers, + nominal_zoom=0, + unpadded_bounds=bounds, + params=dict( + source_layer="test_layer", + items_matching=dict(foo="bar"), + max_items=5, + grid_width=2, + sorting_keys=[ + {"sort_key": "min_zoom", "reverse": True}, + {"sort_key": "population"}, + ], + ), + resources=None, + log=None, + ) + from vectordatasource.transform import keep_n_features_gridded + layer = keep_n_features_gridded(ctx) + output_features = layer['features'] + self.assertEqual(4, len(output_features), "Should not consolidate because we're keeping top 5") + self.assertEqual("test_shape_4", output_features[0][2]) + self.assertEqual("test_shape_1", output_features[1][2]) + self.assertEqual("test_shape_2", output_features[2][2]) + self.assertEqual("test_shape_3", output_features[3][2]) + + def test_fail_on_non_integer_reverse_sort_key(self): + from tilequeue.process import Context + import shapely.geometry + + test_shape_1 = shapely.geometry.Point((1.0, 1.0)) + test_shape_2 = shapely.geometry.Point((1.0, 1.0)) + features = [ + (test_shape_1, {"foo": "bar", "population": 1000}, "test_shape_1"), + (test_shape_2, {"foo": "bar", "population": 'error'}, "test_shape_2"), + ] + feature_layer = dict( + features=features, + layer_datum=dict(name='test_layer'), + ) + feature_layers = [feature_layer] + bounds = (0, 0, 100, 100) + ctx = Context( + feature_layers=feature_layers, + nominal_zoom=0, + unpadded_bounds=bounds, + params=dict( + source_layer="test_layer", + items_matching=dict(foo="bar"), + max_items=5, + grid_width=2, + sorting_keys=[ + {"sort_key": "population", "reverse": True}, + ], + ), + resources=None, + log=None, + ) + from vectordatasource.transform import keep_n_features_gridded + with self.assertRaises(ValueError): + keep_n_features_gridded(ctx) + self.fail("Should raise an exception when reverse-sorting a non-numeric property") + + class TagsPriorityI18nTest(unittest.TestCase): def _call_fut(self, source, kvs): diff --git a/vectordatasource/transform.py b/vectordatasource/transform.py index c66188687..fcd2d10b9 100644 --- a/vectordatasource/transform.py +++ b/vectordatasource/transform.py @@ -3114,6 +3114,113 @@ def _match_props(props, items_matching): return True +def keep_n_features_gridded(ctx): + """ + Distribute the features matching _all_ the key-value + pairs in `items_matching` into a grid, then keep the + first `max_items` features in each grid cell. + + The grid is created by dividing the tile into buckets. + You can specify the `grid_width` and `grid_height` to + get grid_width*grid_height buckets or just `grid_width` + to get grid_width*grid_width buckets. + + This may impact "256" and "512" sized tiles differently, + so it might be worth checking both sizes. + + NOTE: This only works with point features and will + pass through non-point features untouched. + + This is useful for removing less-important features + in areas that are geographically dense. + """ + + feature_layers = ctx.feature_layers + zoom = ctx.nominal_zoom + source_layer = ctx.params.get('source_layer') + assert source_layer, 'keep_n_features_gridded: missing source layer' + start_zoom = ctx.params.get('start_zoom', 0) + end_zoom = ctx.params.get('end_zoom') + items_matching = ctx.params.get('items_matching') + max_items = ctx.params.get('max_items') + grid_width = ctx.params.get('grid_width') + # if grid_height is not specified, use grid_width for grid_height + grid_height = ctx.params.get('grid_height') or grid_width + sorting_keys = ctx.params.get('sorting_keys') + + # leaving items_matching, grid_size, or max_items as None (or zero) + # would mean that this filter would do nothing, so assume + # that this is really a configuration error. + assert items_matching, 'keep_n_features_gridded: missing or empty item match dict' + assert max_items, 'keep_n_features_gridded: missing or zero max number of items' + assert grid_width, 'keep_n_features_gridded: missing or zero grid width' + assert sorting_keys, 'keep_n_features_gridded: missing sorting keys' + assert isinstance(sorting_keys, list), 'keep_n_features_gridded: sorting keys should be a list' + + if zoom < start_zoom: + return None + + # we probably don't want to do this at higher zooms (e.g: 17 & + # 18), even if there are a bunch of features in the tile, as + # we use the high-zoom tiles for overzooming to 20+, and we'd + # eventually expect to see _everything_. + if end_zoom is not None and zoom >= end_zoom: + return None + + layer = _find_layer(feature_layers, source_layer) + if layer is None: + return None + + minx, miny, maxx, maxy = ctx.unpadded_bounds + bucket_width = (maxx - minx) / grid_width + bucket_height = (maxy - miny) / grid_height + + # Sort the features into buckets + buckets = defaultdict(list) + new_features = [] + for shape, props, fid in layer['features']: + # Pass non-point shapes through untouched + if shape.type != 'Point' or not _match_props(props, items_matching): + new_features.append((shape, props, fid)) + continue + + # Calculate the bucket to put this feature in. + # Note that this purposefully allows for buckets outside the unpadded bounds + # so we can bucketize the padding area, too. + bucket_x = int((shape.x - minx) / bucket_width) + bucket_y = int((shape.y - miny) / bucket_height) + bucket_id = (bucket_x, bucket_y) + + buckets[bucket_id].append((shape, props, fid)) + + def sorting_values_for_feature(f): + _, props, _ = f + + values = [] + for k in sorting_keys: + v = props.get(k['sort_key']) + + if v is None: + values.append(v) + continue + + if k.get('reverse'): + v *= -1 + if v == '': + raise ValueError("Cannot reverse string value %s" % props.get(k['sort_key'])) + + values.append(v) + return values + + # Sort the features in each bucket and pick the top items to include in the output + for features_in_bucket in buckets.values(): + sorted_features = sorted(features_in_bucket, key=sorting_values_for_feature) + new_features.extend(sorted_features[:max_items]) + + layer['features'] = new_features + return layer + + def keep_n_features(ctx): """ Keep only the first N features matching `items_matching` diff --git a/yaml/places.yaml b/yaml/places.yaml index 9e126f1f4..5c72e0e81 100644 --- a/yaml/places.yaml +++ b/yaml/places.yaml @@ -159,8 +159,7 @@ filters: - filter: {name: true, place: town} min_zoom: 10 output: - <<: *output_properties - <<: *alternate_fclass + <<: [*output_properties, *alternate_fclass] kind: locality kind_detail: town population: 5000 @@ -183,16 +182,14 @@ filters: - filter: {name: true, population: true, place: locality} min_zoom: 13 output: - <<: *output_properties - <<: *alternate_fclass + <<: [*output_properties, *alternate_fclass] kind: locality kind_detail: locality table: osm - filter: {name: true, place: locality} min_zoom: 14 output: - <<: *output_properties - <<: *alternate_fclass + <<: [*output_properties, *alternate_fclass] kind: locality kind_detail: locality population: 1000 @@ -222,8 +219,7 @@ filters: - filter: { name: true, place: isolated_dwelling } min_zoom: 15 output: - <<: *output_properties - <<: *alternate_fclass + <<: [*output_properties, *alternate_fclass] kind: locality kind_detail: isolated_dwelling population: 100 @@ -231,8 +227,7 @@ filters: - filter: { name: true, population: true, place: farm } min_zoom: 14 output: - <<: *output_properties - <<: *alternate_fclass + <<: [*output_properties, *alternate_fclass] kind: locality kind_detail: farm table: osm