address review findings on voice outlines

- remove the unused Nominatim reserve(); spacing tests now measure the
  actual transport start across processes
- start each queued building's 2 s ground-sampling budget when it
  reaches the head of the queue, and request a frame on promotion
- accept Nominatim and grounds outlines that cross the antimeridian
- let an unnamed school, university, hospital, cemetery, stadium or zoo
  area answer a grounds ask whose head noun names that kind, using only
  the part that holds the point; compare grounds names symmetrically
- charge shared OpenFreeMap consumers their own slice and keep the
  charged budget at the previous 64 MiB
- share one place-name fold, point-in-polygon, line stitching and
  nextTask helper instead of duplicates
- exclude Who's On First sources licensed only as "CC BY (equivalent)"
  or "CC0 (equivalent)"; rebuild the pack from the pinned archives
- whole-word neighbourhood alias guard; correct the outline size-limit
  comment
- restore DATA_SOURCES.md table formatting, keeping only real edits
- test behaviour instead of private engine fields
This commit is contained in:
manjunath committed 2026-10-30 20:47:20 +05:30
1 parent 5a1cfa6800
commit 2e82425d62
37 files changed
+921 -481

No files matched your search

@@ -1 +1 @@
{"tile":"213","features":[[85798825,"Ajuda","PT","neighbourhood",[-9.20765,38.70695,-9.19281,38.71981],["Ажуда","אג'ודה","أجودا","აჟუდა","アジュダ"],"quattroshapes",[["f_cw@{{hkF?}Pha@??lLrZ?bAk@nJvMoBjLqS??lLeP??vYia@?eDsEv@wEw@wE_KcD?y\\"]],[-9.20009,38.71445]],[85798831,"Alcantara","PT","neighbourhood",[-9.18457,38.68684,-9.16809,38.71552],["Alcántara","Alcântara","Алкантара","Алькантара","אלקנטרה","আলকান্টারা","アルカンタラ","알칸타라"],"quattroshapes",[["hm~v@kfhkFpGsB?_Hja@??|PbPjF?f[qG??vEhI?v@tEoBlC?|GdP??dg@uL?oBlC?nIcPlF?lCsG??tEqG??tEmB?w@rEgDxE}F`DeHaDoL?mImL?qt@dP??yYpG??uEpG??kLqG??wEqG??kLeP??yYvL?lBkC"]],[-9.1777,38.70052]],[85798847,"Alfama","PT","neighbourhood",[-9.14062,38.68623,-9.1129,38.71445],["Αλφάμα","Алфама","الفاما","ალფამა","アルファマ","阿尔法玛","알파마"],"quattroshapes",[["niuv@ilhkFpG??lLrG??tEpG??jLbP??jBrG??kBpG??pDbA\\?pBcA??vOjI?pAc@dC`@@lLbP??xY{E?mBfLyEvG?vCiQ|m@yB^gKd@cPuAePtAeKe@wJqBwIwDoHyF}GuJ}NiFmHwF}GsJ|b@_m@?yYlZ?nBkLw@wEdDeA?mCpG?"]],[-9.1288,38.70052]],[85798859,"Alto do Pina","PT","neighbourhood",[-9.13788,38.72838,-9.12332,38.7498],["Алту-ду-Пина","Алту-ду-Піна","التو دو پینا"],"quattroshapes",[["fcvv@kckkFeP??kLcP??kLeDsEv@wEw@wEdDuE?cg@bP??kLdP??yYha@??dg@dP??bg@eP??xYcP??jLeP?"]],[-9.13101,38.74016]],[85798867,"Bairro Lopes","PT","neighbourhood",[-9.12964,38.71766,-9.11591,38.72838],["B. Lopes"],"quattroshapes",[["lmsv@}ujkFha@??mLnr@??rt@eP??jLia@??kLeP??mLcP?"]],[-9.12277,38.72409]],[85798871,"Madre de Deus","PT","neighbourhood",[-9.12689,38.72623,-9.11041,38.74016],["Bairro da Madre de Deus"],"quattroshapes",[["f|rv@_glkF@_QjGcA|L{PvE?dDtE?jLja@??vb@lBlCtL??jLuL?mBlCsGsBqGrB?~Gia@??mLeP??kLeP??{M"]],[-9.11797,38.73349]],[85798877,"Alvalade","PT","neighbourhood",[-9.1497,38.7498,-9.12415,38.77336],["Bairro de Alvalade","Алваладе"],"quattroshapes",[["nlwv@coskFlIkLzg@?nBjL|E??xYbP??jLfDtEgDtE?jLwHlJ}BhNv@vEeDtEeP??jLeP??jLia@??}P{EyGw|@??qt@jZ?|E{G?uk@"]],[-9.1365,38.76158]],[85798887,"Bairro do Alto da Ajuda","PT","neighbourhood",[-9.19556,38.70052,-9.18182,38.71338],[],"quattroshapes",[["bw`w@sehkF|u@??lLdP??dg@eP??jLeP??jLia@??kLeP??av@~JcD"]],[-9.18869,38.70802]],[85798893,"Boavista","PT","neighbourhood",[-9.21204,38.71766,-9.19445,38.74552],["Bairro da Boa Vista","Bairro da Boavista","Bairro do Alto da Boavista"],"quattroshapes",[["jpcw@usmkF?kLdP??mLtcA??|dCmZ?}EzG?|PkBhCe@tFcAj@a^?mBkLmZ??qfA}EyG|EwY?yY"]],[-9.20352,38.73196]],[85798901,"Baixa","PT","neighbourhood",[-9.14749,38.7107,-9.13513,38.72088],["Baixa Pombalina"],"quattroshapes",[["pewv@ilhkF?aSvL?lBmC?}Gz]?v@wEfI??jBjDnAEdCfC?ZjBzE??tEqG??tEsG??tEmE??pBcAZ?|GqG??jBsG??jByE?DhD}@tCmH?g@u@eD?g@s@sG??mLhC??uE"]],[-9.13993,38.71606]],[85798907,"Beato","PT","neighbourhood",[-9.11316,38.71623,-9.07295,38.73909],["Beato António","Беату"],"quattroshapes",[["bxlv@oklkF~d@cUrBuCba@?nIjLzlB??xYeP??jLcP??jLgv@?kLrGmEdQ_CfEsGrCaJjBqJpOoHvFyIxDuJnBeKf@eKg@wJoByIyDmHwFyFoHwDyIqBuJe@eKd@eKpBwJvDyIxFmHlHyF~Aq@"]],[-9.08534,38.72759]],[85798913,"Belem","PT","neighbourhood",[-9.20984,38.68838,-9.20036,38.70122],["Belemo","Belém","Santa Maria de Belém","Санта-Мария-де-Белен","Санта-Марыя-дэ-Белен","Санта-Марія-де-Белен","Բելեմ","בלן","بلم","サンタマリア・デ・ベレン","贝伦区","산타마리아드벨렝"],"quattroshapes",[["zcew@onekF?cJrGrB?nFfI?v@tEi@jGcAxA?pNv@vEw@tE?|MePhF{XaJkGbAkCwOhCqD?yPhC??aF~Ai@?kBpAiB~Ah@hC{@fCz@hC{@?mC"]],[-9.20517,38.69516]],[85798919,"Benfica","PT","neighbourhood",[-9.20765,38.7441,-9.19556,38.7555],[],"quattroshapes",[["jpcw@qepkFdPiFdPhFbPiF?rb@dDrEw@vEnBjL}EzGcPiF_KbDmIkLuE?gDuEcP??wYbP?"]],[-9.20105,38.75087]],[85798939,"Braço de Prata","PT","neighbourhood",[-9.09943,38.74766,-9.03999,38.78764],["Braco de Prata","Fábrica de Braço de Prata"],"quattroshapes",[["d~gv@_qvkFtJqBdKe@`OfApc@v|AkGtIoHvFyIxDuJpBgKd@}EU}BrNyDxIwFnHoHvFyIvDuJpBeKf@eKg@wJqByIwDmHwFyFoHwDyIqBuJe@eKd@gKpBuJvDyIxFoHlHwFxIwDvJqBdKe@|ET~BuNvDyIvFmHnHwF"],["|`kv@}frkFd@eKpBwJvDyIxFmH`UwFjQvJzSxYja@??jL~J?p@kBzF??jBzK??dApAb@[jBv@tEvL??pt@ka@?eDtEsS?uGtEqE?{SvY}}@?aDqMe@eKp@kLq@mLp@kLq@kLp@kL"]],[-9.05501,38.77377]],[85798949,"Calhariz","PT","neighbourhood",[-9.20188,38.73981,-9.19006,38.74766],["Calharis"],"quattroshapes",[["`nbw@onnkF?kLha@?fDtEtE?lIjLw@vEsS??zMcPjF}E{GmZ??yY"]],[-9.1959,38.74391]],[85798957,"Campanhã","PT","neighbourhood",[-8.5938,41.1415,-8.55261,41.17915],["Campanha","Кампаньян","坎帕尼扬"],"whosonfirst",[["`dls@gubzF|BnCcHuF}AQmb@[m@pAoMH{QrHyBgDaCvBaFyDvGuGsIe@}EoB}BEIoBuEgKgABgAxByDKwBv@Sv@mFo@i@u@~AcAoKlCyF{I[oHwCg@mDp@uEqCqDc@oKyK{CcAeEMg@s@KuFgAcBhB{MyA}CeJS~BaCXoFnGvApQtHfDnEb@pDnl@w_@gAkCRgLz@aHbDqFnIaCpHAzBmAoAeL}PmF_AgAtCuMkJyJtRcNtOwDr@hDbJrCvJkAhPOzFdFrL`G|IdHbDo@~\\z}@|MxPxKtUiOrCE~TxBzCwCl@iB`Dg@hJyLtBfEtLaFtBuB|Line truncated
{"tile":"213","features":[[85798825,"Ajuda","PT","neighbourhood",[-9.20765,38.70695,-9.19281,38.71981],["Ажуда","אג'ודה","أجودا","აჟუდა","アジュダ"],"quattroshapes",[["f_cw@{{hkF?}Pha@??lLrZ?bAk@nJvMoBjLqS??lLeP??vYia@?eDsEv@wEw@wE_KcD?y\\"]],[-9.20009,38.71445]],[85798831,"Alcantara","PT","neighbourhood",[-9.18457,38.68684,-9.16809,38.71552],["Alcántara","Alcântara","Алкантара","Алькантара","אלקנטרה","আলকান্টারা","アルカンタラ","알칸타라"],"quattroshapes",[["hm~v@kfhkFpGsB?_Hja@??|PbPjF?f[qG??vEhI?v@tEoBlC?|GdP??dg@uL?oBlC?nIcPlF?lCsG??tEqG??tEmB?w@rEgDxE}F`DeHaDoL?mImL?qt@dP??yYpG??uEpG??kLqG??wEqG??kLeP??yYvL?lBkC"]],[-9.1777,38.70052]],[85798847,"Alfama","PT","neighbourhood",[-9.14062,38.68623,-9.1129,38.71445],["Αλφάμα","Алфама","الفاما","ალფამა","アルファマ","阿尔法玛","알파마"],"quattroshapes",[["niuv@ilhkFpG??lLrG??tEpG??jLbP??jBrG??kBpG??pDbA\\?pBcA??vOjI?pAc@dC`@@lLbP??xY{E?mBfLyEvG?vCiQ|m@yB^gKd@cPuAePtAeKe@wJqBwIwDoHyF}GuJ}NiFmHwF}GsJ|b@_m@?yYlZ?nBkLw@wEdDeA?mCpG?"]],[-9.1288,38.70052]],[85798859,"Alto do Pina","PT","neighbourhood",[-9.13788,38.72838,-9.12332,38.7498],["Алту-ду-Пина","Алту-ду-Піна","التو دو پینا"],"quattroshapes",[["fcvv@kckkFeP??kLcP??kLeDsEv@wEw@wEdDuE?cg@bP??kLdP??yYha@??dg@dP??bg@eP??xYcP??jLeP?"]],[-9.13101,38.74016]],[85798867,"Bairro Lopes","PT","neighbourhood",[-9.12964,38.71766,-9.11591,38.72838],["B. Lopes"],"quattroshapes",[["lmsv@}ujkFha@??mLnr@??rt@eP??jLia@??kLeP??mLcP?"]],[-9.12277,38.72409]],[85798871,"Madre de Deus","PT","neighbourhood",[-9.12689,38.72623,-9.11041,38.74016],["Bairro da Madre de Deus"],"quattroshapes",[["f|rv@_glkF@_QjGcA|L{PvE?dDtE?jLja@??vb@lBlCtL??jLuL?mBlCsGsBqGrB?~Gia@??mLeP??kLeP??{M"]],[-9.11797,38.73349]],[85798877,"Alvalade","PT","neighbourhood",[-9.1497,38.7498,-9.12415,38.77336],["Bairro de Alvalade","Алваладе"],"quattroshapes",[["nlwv@coskFlIkLzg@?nBjL|E??xYbP??jLfDtEgDtE?jLwHlJ}BhNv@vEeDtEeP??jLeP??jLia@??}P{EyGw|@??qt@jZ?|E{G?uk@"]],[-9.1365,38.76158]],[85798887,"Bairro do Alto da Ajuda","PT","neighbourhood",[-9.19556,38.70052,-9.18182,38.71338],[],"quattroshapes",[["bw`w@sehkF|u@??lLdP??dg@eP??jLeP??jLia@??kLeP??av@~JcD"]],[-9.18869,38.70802]],[85798893,"Boavista","PT","neighbourhood",[-9.21204,38.71766,-9.19445,38.74552],["Bairro da Boa Vista","Bairro da Boavista","Bairro do Alto da Boavista"],"quattroshapes",[["jpcw@usmkF?kLdP??mLtcA??|dCmZ?}EzG?|PkBhCe@tFcAj@a^?mBkLmZ??qfA}EyG|EwY?yY"]],[-9.20352,38.73196]],[85798901,"Baixa","PT","neighbourhood",[-9.14749,38.7107,-9.13513,38.72088],["Baixa Pombalina"],"quattroshapes",[["pewv@ilhkF?aSvL?lBmC?}Gz]?v@wEfI??jBjDnAEdCfC?ZjBzE??tEqG??tEsG??tEmE??pBcAZ?|GqG??jBsG??jByE?DhD}@tCmH?g@u@eD?g@s@sG??mLhC??uE"]],[-9.13993,38.71606]],[85798907,"Beato","PT","neighbourhood",[-9.11316,38.71623,-9.07295,38.73909],["Beato António","Беату"],"quattroshapes",[["bxlv@oklkF~d@cUrBuCba@?nIjLzlB??xYeP??jLcP??jLgv@?kLrGmEdQ_CfEsGrCaJjBqJpOoHvFyIxDuJnBeKf@eKg@wJoByIyDmHwFyFoHwDyIqBuJe@eKd@eKpBwJvDyIxFmHlHyF~Aq@"]],[-9.08534,38.72759]],[85798913,"Belem","PT","neighbourhood",[-9.20984,38.68838,-9.20036,38.70122],["Belemo","Belém","Santa Maria de Belém","Санта-Мария-де-Белен","Санта-Марыя-дэ-Белен","Санта-Марія-де-Белен","Բելեմ","בלן","بلم","サンタマリア・デ・ベレン","贝伦区","산타마리아드벨렝"],"quattroshapes",[["zcew@onekF?cJrGrB?nFfI?v@tEi@jGcAxA?pNv@vEw@tE?|MePhF{XaJkGbAkCwOhCqD?yPhC??aF~Ai@?kBpAiB~Ah@hC{@fCz@hC{@?mC"]],[-9.20517,38.69516]],[85798919,"Benfica","PT","neighbourhood",[-9.20765,38.7441,-9.19556,38.7555],[],"quattroshapes",[["jpcw@qepkFdPiFdPhFbPiF?rb@dDrEw@vEnBjL}EzGcPiF_KbDmIkLuE?gDuEcP??wYbP?"]],[-9.20105,38.75087]],[85798939,"Braço de Prata","PT","neighbourhood",[-9.09943,38.74766,-9.03999,38.78764],["Braco de Prata","Fábrica de Braço de Prata"],"quattroshapes",[["d~gv@_qvkFtJqBdKe@`OfApc@v|AkGtIoHvFyIxDuJpBgKd@}EU}BrNyDxIwFnHoHvFyIvDuJpBeKf@eKg@wJqByIwDmHwFyFoHwDyIqBuJe@eKd@gKpBuJvDyIxFoHlHwFxIwDvJqBdKe@|ET~BuNvDyIvFmHnHwF"],["|`kv@}frkFd@eKpBwJvDyIxFmH`UwFjQvJzSxYja@??jL~J?p@kBzF??jBzK??dApAb@[jBv@tEvL??pt@ka@?eDtEsS?uGtEqE?{SvY}}@?aDqMe@eKp@kLq@mLp@kLq@kLp@kL"]],[-9.05501,38.77377]],[85798949,"Calhariz","PT","neighbourhood",[-9.20188,38.73981,-9.19006,38.74766],["Calharis"],"quattroshapes",[["`nbw@onnkF?kLha@?fDtEtE?lIjLw@vEsS??zMcPjF}E{GmZ??yY"]],[-9.1959,38.74391]],[85798957,"Campanhã","PT","neighbourhood",[-8.5938,41.1415,-8.55261,41.17915],["Campanha","Кампаньян","坎帕尼扬"],"whosonfirst",[["`dls@gubzF|BnCcHuF}AQmb@[m@pAoMH{QrHyBgDaCvBaFyDvGuGsIe@}EoB}BEIoBuEgKgABgAxByDKwBv@Sv@mFo@i@u@~AcAoKlCyF{I[oHwCg@mDp@uEqCqDc@oKyK{CcAeEMg@s@KuFgAcBhB{MyA}CeJS~BaCXoFnGvApQtHfDnEb@pDnl@w_@gAkCRgLz@aHbDqFnIaCpHAzBmAoAeL}PmF_AgAtCuMkJyJtRcNtOwDr@hDbJrCvJkAhPOzFdFrL`G|IdHbDo@~\\z}@|MxPxKtUiOrCE~TxBzCwCl@iB`Dg@hJyLtBfEtLaFtBuB|Line truncated
@@ -0,0 +1 @@
{"tile":"230010","features":[[85784689,"Carp","CA","neighbourhood",[-76.234,45.27179,-75.92221,45.38403],["Карп"],"quattroshapes",[["f{moMi_}sGdqA{`A|zCp}AtqAk_AjvC`}AxjBb_Al{@ze@tFnHkx@tg@nbGnqCa~@lo@cz@|n@}SmKowBd}Aw~A`oAwcB{~@iBIoBjAeB?y{@ud@yKmGgCqIijAom@yL}J}{Aqy@mdBqu@ibJbbAcR~DwJ`E_pAr}@ieAld@mKfG{{BjbBoP`HsN~Ce}@jGuXs@kNyBoL}DszCw`Bhm@}c@{hA_m@tB{Ao@_@i@^yDsBxLwIuo@}\\al@pPkWaN|ZBpHe@tv@uTh\\aOhYwPjOoNjFuHlCaPUq^iEcN_C{Bo_Awg@lqAw_Ar]`R~VcOfj@`Vbh@k\\mj@id@`b@eYrInEl]yNzd@xVbrAe{@n]zOnIAdt@~c@{[rSvkAbt@l`BwiAlOlJlLdD`d@vSbT{OrGeCjHa@lo@h@rP{EvNiGva@uJti@gTfM}@fUoHx[mNvSiSbFuArQg@"]],[-76.08177,45.32803]],[85784827,"Orléans","CA","neighbourhood",[-75.55983,45.41982,-75.44106,45.51061],["Orleans","Орлеан","אורלינס","اورلئانز","奧爾良"],"quattroshapes",[["nh~kMucttGmRVeEy@sCLaBw@mChAkFgAmGHjFq@o@q@eDX|Bg@fJMnZpAlWpCpBnAnAOz[jI|LrHvLfDzd@pQh_@dJ|QnHjh@hOgy@rkBlI`Bap@dwAcOrb@uVoH}w@~yBuf@cBg^JarErSpfAu|B}r@{MvAyCas@sMmHlOgeB{^oPiUvIuTemAsUfi@ijAwq@uLgZwDqCoFhHsEl]{EdDmDj^oItDC`OoEpT{CvEqEtPkKzNq@jFqDbA`@nIB~BmUs@mKxE{E{CiAx@iAlHoBoCeF~JiB|OmYeOoZnFaIhMlDlBhDfJtBtLtSbJbEfAOjDsF`@f@sBpFtEXn@v@pOdBxKoDgCsCyESwA_AuLyB{IHwI{B}E{DmE_IzA_@wEsCkH}Jfc@bY~D`BlDR~GfEhJ~AzMpGu@dInA~DfDvDvBj@lGw@N|ArED`AhA^wAnAKz@^aAhAz@l@`Ew@pDjAlCw@zCdCvC?bChAiAjChC|AlHBvHsBhDpAlGh@b^QKi@kF}AqGIb@kAhYzFjOjAqAPsNwAWZhRlE`IDfFyA}@e@oLg@jVd@hQhIbElDzPdGjFuDvDAzBiArHcAnBsBYo@yU}EiLBjN_AeAe@"],["jzvkMmzvtGgJuLg_@sJsFqCjFj@hYbIrQbHfJxBXkCtHpGha@fSzC`GnHx@pDjGnU~FtBbFpCv@hAeAwDqA`@k@|L|EgCpA~AN`BeAZvAj@q@xh@hMeGZmLiA|Ax@q@Xeu@aOsFmBjL`B}o@}P{MuI~BGbHtCz@Y]m@cGmCsK_@sA{@}@qHy@w@{@h@GbEgBnAkJt@aPMqVkJ}NoJPu@fBZxLtI~SjGXu@yD}AOq@|BMrAgBbDsAyEyAFu@jIXzNtDhBJ~A{@w@_BmD`@"],["t~wkMeuutGaC]C_BqHkDP}@|El@tG|Ei@|@jQjGc@r@rMlBFa@aCq@bBJtChCgKw@_a@gIuN}EgBuCf@S|HdCpAdAGjAnMlC"],["bhzkM}qttGgk@yHu^wKbtAjW|I`CInAg@\\"],["rqukMydwtG`DeDrCVbA~B{A`BiGCiE}@"],["t_|kMalttGoPgDVe@nLdBhICg@w@h@CnBr@{HvDyCWbDK"],["nwvkMibvtGnA`AeGc@q@e@"],["t`wkM_avtGKp@u@QF{@"]],[-75.50233,45.46587]],[85784831,"Outremont","CA","neighbourhood",[-73.62699,45.50406,-73.59021,45.52778],["Утремон","Утрмон","Օտրեմոն","מונטריאול/אוטרמונט","أترمون","ウトルモン","欧特蒙地区"],"quattroshapes",[["phd`MqqxtGwE}E|gDcjAfl@lr@tNrSaAgA_x@nXtFhGyJlDhEdFqJhDdQ~RmCpA{_@ic@ih@~Qq@|B_OfFwEcFgR~G{Bk@yRvH}XaX`PwIgCsCfSwEf@{G|Aa@fHP{E_FsC}@q_@L"]],[-73.60803,45.51601]],[85784837,"Pointe-aux-Trembles","CA","neighbourhood",[-73.54462,45.63287,-73.4762,45.7038],[],"quattroshapes",[["l|v_MmwtuGlgCtaAwoCbaA{wD~\\_DuDlBwCkFkEaBwFgKoKyC?j@e@c@mCbDuINaRaEsQA_HaDy@pAmCvByRy@sAnC}ApCqJXsHxCgBZeBYk@mAFg@gBvBE|BwBOoCxEiOo@E`BmBUwCtAwBX{D}AyCAsc@w@}JmAuBFcGaC}JDmOmBaQsFmPuHiIsG_Bp@iAoNsLmIwJ_EkJ}CkPqEqH_@wFmBs@mBgDBwAaAr@iD}FpA?tAtC_@yBhB@~FzAvEB~KjCtGFpH|AbDE`FlAjGJ|k@nOjDJpYjFjFFrBu@LyBdC_EzBRxCjBnAdCi@}B}DaCiDm@gAoAj@a@`Mk@fXnBd@lQpD|Orx@`~Bj@pMmGdm@v@pP"],["f}p_Msg}uGWyD`CiAlCFpLvDjTbB~@dBjC`AyAbBlAlFuJbAyCm@cDyAm@cEgApA_HoEcIoC"],["|}r_Msp|uGmBtHoAl@eM_A`IuArB_HtCC"],["tro_Mq`ruGyEkEqBwJa@kGrAoBz@pL`F|L"],["dvo_MezquG_C{A`@gAhB_@`AlC"],["|po_MwzquGY_A`ADjCfD"],["fno_My|quG{@@Ho@Y}@"]],[-73.50516,45.66877]],[85784995,"Richmond","CA","neighbourhood",[-75.97996,45.15017,-75.72446,45.29069],["Ρίτσμοντ","Ричмонд","Річмонд","ריצ'מונד","رچمنڈ","ریچموند","रिचमंड","রিচমন্ড","リッチモンド","리치먼드"],"quattroshapes",[["bzdnMeblsG`b@GbHkAxPgM|LwEfaAhi@spAzbAbhAtl@uS|O|P|Ib@]~Ax@tNwMhOfIkbAxv@kFqCwBbBvAr@cXtS`hAtk@|OyL[`XjIA`[wF|JqCtBwArBfArqCawBvwBbjAvKtBnSYxDtN`JjMfMpJz]`Se}EdnDgfAbz@qK~FohC|rBc@tBwHbGsv@rl@iEhBqbAfw@kvArbAoJvCeLRcF}GmBc@qHa@{D}AyIEg@fAiA_AcHq@BcFuAu@}LGoK|CaG}@mC~BgFcC{EQqIjDmU?}D}Bj@cB[yG}Jw@hA`ByGwAiHOiC]wDcCGmMq@eAUt@w@C]iErIqHPwAkC_IkECsCXt@fAi@ZsIb@w@]uAl@cAbDaDvBwE@qDeAsFj@s|@tn@tAdAaRlQxExDwA~B{ChA}kB}`AsCyCaFiAwc@eUqTmDwyBgp@oE@uaCyt@oKyEy}Bqr@sFMwBsKrtBwnC`tA}iCi@KpHoJlNgJlJqDzOiCtt@aF`U{D|M_GxKsIdy@{_B~uAmdB`CsIVyJaBuJ}DwHtvBtn@bEaKneAv[{A`D|fBlh@vt@pGjIo@zIoC~i@}_@|FkB`SqClG}B"]],[-75.85788,45.22831]],[85785125,"Anjou","CA","neighbourhood",[-73.60308,45.5903,-73.53589,45.6342],["Anchú","Andegawenia","Angeow","Angiò","Anjau","Anjev","Anju","Anĵuo","Anžu","Ducado de Anjou","Ανζού","Анжу","אנז'ו","آنژو","أنجو","اونژو","อ็องฌู","ანჟუ","アンジュー","安茹","앙주"],"quattroshapes",[["vry_MotiuGViBk@FbCmKzBe@m@qApXsIsCuDrCaA_BeGdY_GkD{GbJkBeE_HsFoDue@hFkCoKdAe@IoB{HkUziEmvAnhDzqB|QzI`WhHgChCxGtCeaDpeA~@~AmIn@ge@|No@oBa_Cxi@_NqVtIwB_DsDmHrB}KgRbAWz@qF`A_@cA}EhBmAs@oDcXvFiE_F`SyGwCiE"]],[-73.57365,45.61239]],[85785137,"Greely","CA","neighbourhood",[-75.69564,45.18762,-75.51753,45.31002],["格里利"],"quattroshapes",[["xwflMcujsGdmBo|Df|@|WyDvIpy@zVtEs@v_@l@wN~YjcAsW``Bpf@iOx[trAla@~g@nm@h\\rXzP~PzW`SvOhJlmDxgAyJfQqEcAaBjCubEkrAoQiAqlAs^mWrk@sc@f|@{dAm]q{AfsC}|CvsGcDnAqFmGqScImpBym@mQmIm|FklBjpB{hE|AwDc@}BpEcErLoUzE_Fg@oAbgBcpD"]],[-75.57292,45.24081]],[85864423,"Fabreville","CA","Line truncated
@@ -1 +0,0 @@
{"tile":"2300100","features":[[85784689,"Carp","CA","neighbourhood",[-76.234,45.27179,-75.92221,45.38403],["Карп"],"quattroshapes",[["f{moMi_}sGdqA{`A|zCp}AtqAk_AjvC`}AxjBb_Al{@ze@tFnHkx@tg@nbGnqCa~@lo@cz@|n@}SmKowBd}Aw~A`oAwcB{~@iBIoBjAeB?y{@ud@yKmGgCqIijAom@yL}J}{Aqy@mdBqu@ibJbbAcR~DwJ`E_pAr}@ieAld@mKfG{{BjbBoP`HsN~Ce}@jGuXs@kNyBoL}DszCw`Bhm@}c@{hA_m@tB{Ao@_@i@^yDsBxLwIuo@}\\al@pPkWaN|ZBpHe@tv@uTh\\aOhYwPjOoNjFuHlCaPUq^iEcN_C{Bo_Awg@lqAw_Ar]`R~VcOfj@`Vbh@k\\mj@id@`b@eYrInEl]yNzd@xVbrAe{@n]zOnIAdt@~c@{[rSvkAbt@l`BwiAlOlJlLdD`d@vSbT{OrGeCjHa@lo@h@rP{EvNiGva@uJti@gTfM}@fUoHx[mNvSiSbFuArQg@"]],[-76.08177,45.32803]],[85864481,"Corkery","CA","neighbourhood",[-76.1765,45.17292,-75.96985,45.3213],["Huntley"],"quattroshapes",[["fkynMgzisGx{BkbBlKgGheAmd@~oAs}@vJaEbR_EhbJcbAldBpu@|{Apy@xL|JhjAnm@fCpIxKlGx{@td@dB?nBkAhBHvcBz~@oeEfhDkbEj{C_w@jn@qoAl}@{tFxhEwDkByJgBcDwA{FeK_BeH{K}pBeH_UsLmOoJaIiyCm_Be_B_t@y]sQm[oM}bBcaAaJwImIwPcBuMP{JrWekBw@oMzNt@jPWvi@iDfOmBfJ}B"]],[-76.05726,45.24658]],[85864667,"Constance Bay","CA","neighbourhood",[-76.11378,45.4716,-76.06675,45.51143],[],"quattroshapes",[["nfioM_zstGfHqRnA{N_@_OoB}GiE{FlHwAlJEfGuBhToDbH{GfFyLhSqCxDuBvEwFxMoDfDsEzPp@fMhC~e@bDr[bH~GLxGnBhH`H_@zAe\\pRcW`R}VrLcDfFuB`@eQxJ_@`D_GaAgCpEmDdCcAxCcEh@kBdAeAjH}CsDoRmJqbApp@zp@b_@m}@fk@qr@ub@xCg@pGyDbN_c@pAeS"]],[-76.081,45.49142]],[85864673,"Dunrobin","CA","neighbourhood",[-76.11528,45.34631,-75.91448,45.49113],["Данробин"],"quattroshapes",[["nedoM{ystGhFbD~Ca@`CuB_BmCv@MlAjAA|AuB~CdDn@@f@gBhDsInCg@bDzD~CdB\\~BQnC{DfEhBEf@{BP}B~CjGvGeGhTdB|BnP`Hxf@xLzBSvAiBnB\\vDsBjF`BbEyApM|FkHxDu@lDmIrIS|AfLkIvC_GfE}@RqDbf@zYbd@r[sc@d[puAns@`kCh`BrWvHegAnv@iRhHy`B`lAcUxM}cCtaBenAou@enC`jBanBloAarAb~@gs@xc@{d@yVm]xNsIoEab@dYlj@hd@ch@j\\gj@aVgW`OytAyt@kRsDwQyGbFqDct@u`@gNtJg[eQjqCoqBo{CmcBOw@mAByHvEmIeCaJc@{CyBfFoDzNsDbCiBhc@ij@vWiWre@{o@pKmKAiAvAM~OaQ`MwJdJyOzAMVwGpB{Ev[sYzG{CxHoI`@oCzB{BM_AcDm@}DpCqCKlHqCx@oCcAg@JaBlC}AnCWrBqEdHqFt@gEpDoH|BkBl@mI|AoBhPcO|F{AxBkFrD}DtPkMxC{DhHeAfW}SvIiDfDaDdQwIbCwCzr@e`@jf@wNoFaDf@YpChCnAw@uCqBq@Nx@e@bDxBt@e@qCcCpH`F`AMRyArF}CpL]Q}@lJiElDGnE}BlDe@jFCtQzBdRlFbNiD|Ts@vPwH|JaHl@qBtKt@xH[xReJpDg@bEsDhEm@x@yAvReEpGsCvV{@xBrDtGbAnFsBpF}EnDc@tFcD"]],[-76.01077,45.41797]],[85864683,"Munster","CA","neighbourhood",[-76.05229,45.08001,-75.87256,45.23957],["Манстер"],"quattroshapes",[["p{onMck}rGd}EenDl`Adj@pW`Kx]rQd_B~s@hyCl_BnJ`IrLlOdH~TzK|pB~AdHzFdKbDvAxJfBvDjBomH~yFy}D`{C{p@fj@gFpBkB`DwcAxx@sgA~~@gfD_vAkd@mTsdC_eA{xA}rGjvAsbApbAgw@hEiBj`Awt@b@uBnhC}rBpK_G"]],[-75.957,45.15812]],[1125137919,"Fitzroy Harbour","CA","microhood",[-76.22124,45.45898,-76.20039,45.4779],[],"mz",[["z~dpM{kqtGz]vQkKbJe@jDaEn@gDvB{DfE[xBrBnFPaAhGrBeHtFSpB`AdAnFjAdJ_Bws@xl@kdAaj@tC{J|@{@nHmBtKaKrNiEzIi@bByEvEqDfBaHp\\qJ"]],[-76.21025,45.46849]],[1125223987,"Morgan's Grant","CA","neighbourhood",[-75.95165,45.3401,-75.92488,45.35835],[],"mz",[["zsmnMwoysGjV}OvQxGbPjCtx@`c@mqAx_A{sAyv@"]],[-75.93825,45.34975]],[1125978557,"West Carleton","CA","macrohood",[-76.35392,45.17293,-75.91448,45.51661],[],"mz",[["lnlpM_sgtGuMpDoAi@kB`CjEp@bBlArCvFu@~@_FxAu@zBmEvBa@vAsCbAmAjCh@~CxLjClH~GmAhWeDnNeJlTCpD`D~DLrGcAlGeElJ`AhLmAxDAlEhKhLfKbEtFxDlAnC^~FiCjL?rItJjOfp@th@`TxZlHbRrDnBjYnFnKpGg@dCcI|F{PtGaItEo@bGhDzO}FbPtFvHFrE`GnFdHxC~XvBdKfBijC|gB}qEraDcz@|n@}SmKowBd}AyzGvoFo|ErpDig@ta@qoAl}@grFvfEsA`AwEwByI{AqGkEkEyL}LwtB{CmMyK}QsOgNomBidAqx@eb@mqA}k@y]sQqWaKyiBgfAaGaGwE{H}C}JaAwMjX}rBw@oMkNyBoL}DszCu`Bhm@_d@{hA_m@tB{Ao@_@i@^yDsBxLwIuo@}\\al@pPkWaN|ZBpHe@l~@cXzn@k]tSsS`BqClCaPJaUa@oHiEcN_C{Bo_Aug@lqAy_Aux@ac@cPkCwQyGbFoDct@w`@gNtJg[eQjqCoqBo{CmcBOw@mABwHvEoIeCaJc@{CyBfFoDzNsDbCiBhc@ij@vWiWre@{o@pKmKAiAvAM~OaQ`MwJdJyOzAMVwGpB{Ev[sYzG{CzHoI^oCzB{BM_AcDk@}DnCqCKlHqCx@oCcAg@JaBlC}AnCWrBqEdHqFt@gEpDoH|BkBl@mI|AoBhPcO|F{AxBkFrD}DtPkMxC{DhHeAfW}SvIiDfDaDdQwIbCwCzr@e`@jf@wNoFaDf@YpChCpAw@wCqBq@Nx@e@bDxBt@c@qCeCpH`F`AMRyArF}CpL]Q}@lJiElDGnE}BlDe@jFCtQzBdRlFbNgD|Tu@vPwH|JaHl@oBtKr@xH[xReJpDg@dEsDfEm@x@yAvReEpGsCvV{@xBrDtGbAnFsBpF}EnDc@vFcDdLe@rATpCnCbDc@`CuBcAaDhBpAA|AuB~CdDn@@f@gBhDuGjBoBzAp@zCxFlC~BQnC{DfEhBEf@{BR{B|ChGvGuDbKaArIfSpJxf@xLzBSvAiBnB\\vDsBjF`BbEyApM|FkHxDu@lDmIrIF|AjKkIvC_GfE}@RqDmKyGxCg@pGyDbN_c@pAeSfNqQdHgRpAeO_@_OoB}G}DeG`HmAlJEfGuBhToDbH{GfFyLhSqCxDuBvEwFxMoDfDsEzPp@fMhC~e@bDdL`DlN`C~GLxGnB|F~El@zBg]rSg[~TyRtIcDfFuB`@eQxJ_@`D_GaAgCpEmDdCcAxCcEh@kBdAeAjHhDbB|CMtC}BcAuAv@i@~HEtFuB`VsQvTiMxLcKx\\wP|MiIhFeF|XsNnIaIdl@yVvUoGvKmEba@eJhFFfOfClKI|OlH`IKzPhD`Kf@r^_@vPsAlS`@n^sDjR~EzCFtGuFfZrFvEQ~KeD}Cg@sNpBg@g@zB{ArO_EbQExF{CtKmBzEwBhF?zZtCbJi@dGaBtHUlLz@fD|ArWGfQjB~J?fTtQnL[`IzAjZdAxl@pWr@v@gAxGzMrJx@zDkSdZnBpFoHrGIzG|A|FdBlAcCB_CxDgDjTf@~HxBrFjBFQnCaJrE{@fC}FzD_Cb@mNMiF|CwCjJoBIoAdAcM`AyFxEVVlHoElIa@xGsAnAqGzFqFxNR~JuCnFnAoCLwBxG{Ad@m@rF{A~BfArAyBCwIzEA~AwAPaAhBr@~AeDhC{F`AeBhAyGtGe@jDaEn@cJ~HUnEbAh@DrA|@XG_AjG`CgHfFSpB~@dApFjAdJ_B}Ai@wEx@}CEuAgAz@yC~J_Bp@VxIq@hJcEjQyDaA[Nu@bOqDpGaF\\RfEaBzF?bFmEvBHjCw@dCV{@oCnE}Az@aDdB`@q@zAtJ[TdAoHZwYb`@iNlKfEl[jZrN|o@`DXmA`FXzDkAnAM`@j@nCy@tB`BpCHn@i@PxAvDnAvDeAoBg@dAMi@oBvIaBAcAkAa@hAeBrA?\\mA`E@`@xBlBo@Line truncated
@@ -1 +0,0 @@
{"tile":"2300101","features":[[85784827,"Orléans","CA","neighbourhood",[-75.55983,45.41982,-75.44106,45.51061],["Orleans","Орлеан","אורלינס","اورلئانز","奧爾良"],"quattroshapes",[["nh~kMucttGmRVeEy@sCLaBw@mChAkFgAmGHjFq@o@q@eDX|Bg@fJMnZpAlWpCpBnAnAOz[jI|LrHvLfDzd@pQh_@dJ|QnHjh@hOgy@rkBlI`Bap@dwAcOrb@uVoH}w@~yBuf@cBg^JarErSpfAu|B}r@{MvAyCas@sMmHlOgeB{^oPiUvIuTemAsUfi@ijAwq@uLgZwDqCoFhHsEl]{EdDmDj^oItDC`OoEpT{CvEqEtPkKzNq@jFqDbA`@nIB~BmUs@mKxE{E{CiAx@iAlHoBoCeF~JiB|OmYeOoZnFaIhMlDlBhDfJtBtLtSbJbEfAOjDsF`@f@sBpFtEXn@v@pOdBxKoDgCsCyESwA_AuLyB{IHwI{B}E{DmE_IzA_@wEsCkH}Jfc@bY~D`BlDR~GfEhJ~AzMpGu@dInA~DfDvDvBj@lGw@N|ArED`AhA^wAnAKz@^aAhAz@l@`Ew@pDjAlCw@zCdCvC?bChAiAjChC|AlHBvHsBhDpAlGh@b^QKi@kF}AqGIb@kAhYzFjOjAqAPsNwAWZhRlE`IDfFyA}@e@oLg@jVd@hQhIbElDzPdGjFuDvDAzBiArHcAnBsBYo@yU}EiLBjN_AeAe@"],["jzvkMmzvtGgJuLg_@sJsFqCjFj@hYbIrQbHfJxBXkCtHpGha@fSzC`GnHx@pDjGnU~FtBbFpCv@hAeAwDqA`@k@|L|EgCpA~AN`BeAZvAj@q@xh@hMeGZmLiA|Ax@q@Xeu@aOsFmBjL`B}o@}P{MuI~BGbHtCz@Y]m@cGmCsK_@sA{@}@qHy@w@{@h@GbEgBnAkJt@aPMqVkJ}NoJPu@fBZxLtI~SjGXu@yD}AOq@|BMrAgBbDsAyEyAFu@jIXzNtDhBJ~A{@w@_BmD`@"],["t~wkMeuutGaC]C_BqHkDP}@|El@tG|Ei@|@jQjGc@r@rMlBFa@aCq@bBJtChCgKw@_a@gIuN}EgBuCf@S|HdCpAdAGjAnMlC"],["bhzkM}qttGgk@yHu^wKbtAjW|I`CInAg@\\"],["rqukMydwtG`DeDrCVbA~B{A`BiGCiE}@"],["t_|kMalttGoPgDVe@nLdBhICg@w@h@CnBr@{HvDyCWbDK"],["nwvkMibvtGnA`AeGc@q@e@"],["t`wkM_avtGKp@u@QF{@"]],[-75.50233,45.46587]],[85784831,"Outremont","CA","neighbourhood",[-73.62699,45.50406,-73.59021,45.52778],["Утремон","Утрмон","Օտրեմոն","מונטריאול/אוטרמונט","أترمون","ウトルモン","欧特蒙地区"],"quattroshapes",[["phd`MqqxtGwE}E|gDcjAfl@lr@tNrSaAgA_x@nXtFhGyJlDhEdFqJhDdQ~RmCpA{_@ic@ih@~Qq@|B_OfFwEcFgR~G{Bk@yRvH}XaX`PwIgCsCfSwEf@{G|Aa@fHP{E_FsC}@q_@L"]],[-73.60803,45.51601]],[85784837,"Pointe-aux-Trembles","CA","neighbourhood",[-73.54462,45.63287,-73.4762,45.7038],[],"quattroshapes",[["l|v_MmwtuGlgCtaAwoCbaA{wD~\\_DuDlBwCkFkEaBwFgKoKyC?j@e@c@mCbDuINaRaEsQA_HaDy@pAmCvByRy@sAnC}ApCqJXsHxCgBZeBYk@mAFg@gBvBE|BwBOoCxEiOo@E`BmBUwCtAwBX{D}AyCAsc@w@}JmAuBFcGaC}JDmOmBaQsFmPuHiIsG_Bp@iAoNsLmIwJ_EkJ}CkPqEqH_@wFmBs@mBgDBwAaAr@iD}FpA?tAtC_@yBhB@~FzAvEB~KjCtGFpH|AbDE`FlAjGJ|k@nOjDJpYjFjFFrBu@LyBdC_EzBRxCjBnAdCi@}B}DaCiDm@gAoAj@a@`Mk@fXnBd@lQpD|Orx@`~Bj@pMmGdm@v@pP"],["f}p_Msg}uGWyD`CiAlCFpLvDjTbB~@dBjC`AyAbBlAlFuJbAyCm@cDyAm@cEgApA_HoEcIoC"],["|}r_Msp|uGmBtHoAl@eM_A`IuArB_HtCC"],["tro_Mq`ruGyEkEqBwJa@kGrAoBz@pL`F|L"],["dvo_MezquG_C{A`@gAhB_@`AlC"],["|po_MwzquGY_A`ADjCfD"],["fno_My|quG{@@Ho@Y}@"]],[-73.50516,45.66877]],[85784995,"Richmond","CA","neighbourhood",[-75.97996,45.15017,-75.72446,45.29069],["Ρίτσμοντ","Ричмонд","Річмонд","ריצ'מונד","رچمنڈ","ریچموند","रिचमंड","রিচমন্ড","リッチモンド","리치먼드"],"quattroshapes",[["bzdnMeblsG`b@GbHkAxPgM|LwEfaAhi@spAzbAbhAtl@uS|O|P|Ib@]~Ax@tNwMhOfIkbAxv@kFqCwBbBvAr@cXtS`hAtk@|OyL[`XjIA`[wF|JqCtBwArBfArqCawBvwBbjAvKtBnSYxDtN`JjMfMpJz]`Se}EdnDgfAbz@qK~FohC|rBc@tBwHbGsv@rl@iEhBqbAfw@kvArbAoJvCeLRcF}GmBc@qHa@{D}AyIEg@fAiA_AcHq@BcFuAu@}LGoK|CaG}@mC~BgFcC{EQqIjDmU?}D}Bj@cB[yG}Jw@hA`ByGwAiHOiC]wDcCGmMq@eAUt@w@C]iErIqHPwAkC_IkECsCXt@fAi@ZsIb@w@]uAl@cAbDaDvBwE@qDeAsFj@s|@tn@tAdAaRlQxExDwA~B{ChA}kB}`AsCyCaFiAwc@eUqTmDwyBgp@oE@uaCyt@oKyEy}Bqr@sFMwBsKrtBwnC`tA}iCi@KpHoJlNgJlJqDzOiCtt@aF`U{D|M_GxKsIdy@{_B~uAmdB`CsIVyJaBuJ}DwHtvBtn@bEaKneAv[{A`D|fBlh@vt@pGjIo@zIoC~i@}_@|FkB`SqClG}B"]],[-75.85788,45.22831]],[85785125,"Anjou","CA","neighbourhood",[-73.60308,45.5903,-73.53589,45.6342],["Anchú","Andegawenia","Angeow","Angiò","Anjau","Anjev","Anju","Anĵuo","Anžu","Ducado de Anjou","Ανζού","Анжу","אנז'ו","آنژو","أنجو","اونژو","อ็องฌู","ანჟუ","アンジュー","安茹","앙주"],"quattroshapes",[["vry_MotiuGViBk@FbCmKzBe@m@qApXsIsCuDrCaA_BeGdY_GkD{GbJkBeE_HsFoDue@hFkCoKdAe@IoB{HkUziEmvAnhDzqB|QzI`WhHgChCxGtCeaDpeA~@~AmIn@ge@|No@oBa_Cxi@_NqVtIwB_DsDmHrB}KgRbAWz@qF`A_@cA}EhBmAs@oDcXvFiE_F`SyGwCiE"]],[-73.57365,45.61239]],[85785137,"Greely","CA","neighbourhood",[-75.69564,45.18762,-75.51753,45.31002],["格里利"],"quattroshapes",[["xwflMcujsGdmBo|Df|@|WyDvIpy@zVtEs@v_@l@wN~YjcAsW``Bpf@iOx[trAla@~g@nm@h\\rXzP~PzW`SvOhJlmDxgAyJfQqEcAaBjCubEkrAoQiAqlAs^mWrk@sc@f|@{dAm]q{AfsC}|CvsGcDnAqFmGqScImpBym@mQmIm|FklBjpB{hE|AwDc@}BpEcErLoUzE_Fg@oAbgBcpD"]],[-75.57292,45.24081]],[85864423,"Fabreville","CA","neighbourhood",[-73.87252,45.54957,-73.769,45.61083],[],"can-lvlsu",[["h`naM}wjuGtDaOxKcAxKAzI|DvXzGzKxEhHDnRsFtDBxCdA`HnGdB`FuBfX~AvLxBpEzOzIbGzFnG`KjAfRqAnMr@jEfClCfNlFhDxCfBxDtA|JfFrGfKjE`q@lH`GbCxOjMjShJb^`HxGpFlE~PlB|C|UzLd`@tL_jAffAkCs@sBlBcKcHeDk@y@t@aCqCeLlKkEeA}FlFgUaIkJtImTgTcL}BkBlBaEyA{KU{F_N~CqCmBs@rBiBiBaA\\cA`FkFaFwAyY|WyMYaRd@i]wCam@b@gFOqD{AeFc@ipA_h@dP{O{BqDn@iF{JwFcGe@_DjDiYiDg`@gT_W}IiTa@aGwBgPJcTyJ}EeK}IkC~HHpQqAtKaCld@yNbEqEhCeGpJoDzBuMfDT`StF`GJnq@_TpIsEvHaKjEuTkCeJ`BcJnGuCzCaObKeO_EsB"]],[-73.80453,45.58019]],[85864453,"Navan","CA","neighbourhood",[-75.49517,45.41Line truncated
@@ -19,7 +19,6 @@ Neighborhood boundaries from [Who's On First](https://whosonfirst.org/docs/licen
| Zolk Chicago Neighborhoods Map (`zolk`) | 207 | CC BY 3.0 US | [terms](http://chicagomap.zolk.com/about.html) |
| Azavea, Inc. (`azavea`) | 157 | CC BY 3.0 US | [terms](https://www.opendataphilly.org/dataset/philadelphia-neighborhoods) |
| City of Calgary, Corporate Analytics and Innovation (`can-calcai`) | 151 | Open Government Licence - City of Calgary | [terms](https://data.calgary.ca/stories/s/u45n-7awa) |
| Portal de datos abiertos del Ayuntamiento de Madrid (`esp-aytomad`) | 150 | CC0 (equivalent) | [terms](http://datos.madrid.es/egob/catalogo/aviso-legal) |
| City of Winnipeg Department of Planning, Property, and Development (`can-wpgppd`) | 132 | Open Government License - Winnipeg | [terms](https://data.winnipeg.ca/open-data-licence) |
| Atlanta Department of Planning and Community Development (`atldpcd`) | 130 | CC BY 4.0 | [terms](https://www.arcgis.com/home/item.html?id=716f417a1990446389ef7fd2c381d09f) |
| Turku City Government (`tkugov`) | 129 | CC BY 4.0 | [terms](http://www.lounaistieto.fi/blog/2015/08/18/turun-palvelualuejakotilastoalueet/) |
@@ -32,7 +31,6 @@ Neighborhood boundaries from [Who's On First](https://whosonfirst.org/docs/licen
| CartoBCN (`esp-cartobcn`) | 83 | CC BY | [terms](http://w133.bcn.cat/geoportal/descargas/en_gb_cond_us_carto.pdf) |
| Toronto Social Development, Finance & Administration Department (`torsdfa`) | 83 | Open Government Licence - Ontario, v1.0 | [terms](http://www1.toronto.ca/wps/portal/contentonly?vgnextoid=4a37e03bb8d1e310VgnVCM10000071d60f89RCRD) |
| Denver Department of Community Planning and Development (`denvercpd`) | 77 | CC BY 3.0 | [terms](https://www.denvergov.org/opendata/termsofuse) |
| Gatineau Service de l'urbanisme et du developpement durable (SUDD) (`can-gatsudd`) | 74 | CC BY (equivalent) | [terms](http://www3.gatineau.ca/Infoterritoire/WebInterface/help/fr/Content/1_About/1_About_FR.htm) |
| City of New Orleans, Office of Information Technology and Innovation, Enterprise Information Team (`nolagis`) | 71 | CC0 | [terms](https://data.nola.gov/Geographic-Base-Layers/Neighborhoods/92zg-wzkq) |
| Ciudad Autonoma de Buenos Aires, Iniciativa de Datos Publicos y Transparencia (`arg-caba`) | 48 | CC BY | [terms](https://data.buenosaires.gob.ar/tyc) |
| Montreal Service de la Mise en Valeur du Territoire (`can-mtlsmvt`) | 48 | CC BY 4.0 | [terms](https://creativecommons.org/licenses/by/4.0/) |
@@ -265,4 +263,4 @@ Neighborhood boundaries from [Who's On First](https://whosonfirst.org/docs/licen
## Source-specific exclusions
This derived pack excludes 36 `can-ons` records, 54 `can-saskodp` records. Original source-specific redistribution terms have not been established for these records in this derived pack. Original upstream notices remain unchanged.
Sources whose pinned registry licence is only an "equivalent" designation (for example "CC BY (equivalent)" or "CC0 (equivalent)"), including can-ons, can-saskodp, can-gatsudd and esp-aytomad, are not admitted: their redistribution terms have not been established for this derived pack. Original upstream notices remain unchanged.
@@ -12,7 +12,7 @@ DataSF pack in `../neighborhoods/` is used first inside San Francisco.
| `files.js` | every file's URL, so bundlers emit them (generated) |
| `whosonfirst-LICENSE.md`, `quattroshapes-LICENSE.md` | upstream notices, unchanged |
61,665 named neighbourhood, macrohood and microhood polygons in 218 tiles.
61,441 named neighbourhood, macrohood and microhood polygons in 217 tiles.
**Source:** [Who's On First](https://whosonfirst.org/) and contributors:
`whosonfirst-data-{neighbourhood,macrohood,microhood}-latest.tar.bz2` from
@@ -46,10 +46,13 @@ a `[lon, lat]` point inside the largest polygon. A ring is an encoded
polyline string: longitude then latitude at 10^-5 degrees, zigzag varint
deltas, 5-bit groups offset by 63.
**Source-specific exclusions:** This derived pack excludes 36 `can-ons` records, 54 `can-saskodp` records. Original source-specific redistribution terms have not been established for these records in this derived pack. Original upstream notices remain unchanged.
The original pinned records are partitioned first; exact source/ID exclusions
are then applied within those tiles, preserving every remaining tile path.
**Licence exclusions:** only sources whose exact registry licence is on the
reviewed allowlist in `scripts/wof-open-licenses.json` are admitted. A licence
listed only as an "equivalent" of an open licence ("CC BY (equivalent)",
"CC0 (equivalent)") is not admitted, so `can-ons`, `can-saskodp`,
`can-gatsudd` and `esp-aytomad` records are not in this pack: their
redistribution terms have not been established for this derived pack.
Original upstream notices remain unchanged.
**Curation:** current, non-deprecated, named polygon records; simplified to
about 15 m, snapped to 5 decimals and kept valid under GEOS (checked on the
@@ -48,8 +48,7 @@ export const TILE_URLS = {
t221031: () => new URL('./221031.json', import.meta.url),
t221033: () => new URL('./221033.json', import.meta.url),
t2211: () => new URL('./2211.json', import.meta.url),
t2300100: () => new URL('./2300100.json', import.meta.url),
t2300101: () => new URL('./2300101.json', import.meta.url),
t230010: () => new URL('./230010.json', import.meta.url),
t230011: () => new URL('./230011.json', import.meta.url),
t23111: () => new URL('./23111.json', import.meta.url),
t231130: () => new URL('./231130.json', import.meta.url),
@@ -19,11 +19,8 @@
"url": "https://raw.githubusercontent.com/whosonfirst/whosonfirst-sources/e17af153c144fe6e08aa8db2607b4bf8aecd448d/data/sources-spec-latest.json",
"sha256": "d8a5dd873d26eee11583de4438185c046dec33848d5bde27047ca4bff44d9c39"
},
"recordExclusions": {
"can-ons": 36,
"can-saskodp": 54
},
"recordExclusionReason": "Original source-specific redistribution terms have not been established for these records in this derived pack.",
"recordExclusions": {},
"recordExclusionReason": "Sources whose pinned registry licence is only an \"equivalent\" designation (for example \"CC BY (equivalent)\" or \"CC0 (equivalent)\"), including can-ons, can-saskodp, can-gatsudd and esp-aytomad, are not admitted: their redistribution terms have not been established for this derived pack.",
"license": "Per source; see sources and ATTRIBUTION.md",
"format": "neighborhood-polylines-v1",
"fields": [
@@ -108,12 +105,6 @@
"terms": "https://www.edmonton.ca/city_government/documents/Web-version2.1-OpenDataAgreement.pdf",
"records": 332
},
"can-gatsudd": {
"name": "Gatineau Service de l'urbanisme et du developpement durable (SUDD)",
"license": "CC BY (equivalent)",
"terms": "http://www3.gatineau.ca/Infoterritoire/WebInterface/help/fr/Content/1_About/1_About_FR.htm",
"records": 74
},
"can-lvlsu": {
"name": "Laval Service de l'urbanisme",
"license": "CC BY",
@@ -174,12 +165,6 @@
"terms": "https://www.denvergov.org/opendata/termsofuse",
"records": 77
},
"esp-aytomad": {
"name": "Portal de datos abiertos del Ayuntamiento de Madrid",
"license": "CC0 (equivalent)",
"terms": "http://datos.madrid.es/egob/catalogo/aviso-legal",
"records": 150
},
"esp-cartobcn": {
"name": "CartoBCN",
"license": "CC BY",
@@ -770,7 +755,7 @@
},
{
"key": "213",
"count": 445,
"count": 295,
"bbox": [
-9.8565,
37.09996,
@@ -829,20 +814,10 @@
]
},
{
"key": "2300100",
"count": 16,
"key": "230010",
"count": 375,
"bbox": [
-76.35559,
45.08001,
-75.87256,
45.51661
]
},
{
"key": "2300101",
"count": 433,
"bbox": [
-76.31305,
44.96177,
-73.33863,
45.71368
+4 -23
View File
@@ -42,6 +42,7 @@ import {
rank,
} from './adminBoundaries.js';
import { loadBundledJson } from './bundledJson.js';
import { foldPlaceName } from './placeNames.js';
import { createRetryableLoader } from './retryableLoad.js';
import * as placeFiles from './local_data/us_census_places/files.js';
import * as neighborhoodFiles from './local_data/wof_neighborhoods/files.js';
@@ -63,17 +64,6 @@ export const packLoads = {
neighborhoodTiles: [],
};
const FOLD = {
ß: 'ss',
ø: 'o',
æ: 'ae',
ł: 'l',
đ: 'd',
ı: 'i',
œ: 'oe',
þ: 'th',
};
/**
* A name as spelled: case and punctuation only. Every mark is kept, so
* "की" and "क", "Й" and "И" stay distinct.
@@ -87,20 +77,11 @@ export function exactPlaceName(value) {
}
/**
* Fold a name for matching: case, punctuation, accents on Latin letters
* only, a leading "the", "saint". Other scripts keep their marks
* ("渋谷", "Кунцево", "बांद्रा").
* Fold a name for matching (see `foldPlaceName`), with "saint" and "sainte"
* shortened the way US place names abbreviate them.
*/
export function normalizePlaceName(value) {
return String(value || '')
.toLowerCase()
.replace(/[ßøæłđıœþ]/g, (c) => FOLD[c])
.normalize('NFD')
.replace(/(\p{Script=Latin})\p{M}+/gu, '$1')
.normalize('NFC')
.replace(/[^\p{L}\p{M}\p{N}]+/gu, ' ')
.trim()
.replace(/^the /, '')
return foldPlaceName(value)
.replace(/\bsaint\b/g, 'st')
.replace(/\bsainte\b/g, 'ste');
}
+12 -17
View File
@@ -379,6 +379,7 @@ test('places pack: every state file, unique ids, sane and valid rings', () => {
});
const WOF_LICENSE_POLICY = readJson(WOF_LICENSES);
const WOF_RECORD_COUNT = 61_441;
const ALLOWED_WOF_LICENSES = new Set(WOF_LICENSE_POLICY.licenses);
const licenceAllowed = (value) =>
typeof value === 'string' && ALLOWED_WOF_LICENSES.has(value);
@@ -455,6 +456,8 @@ test('neighborhood pack ships only explicitly allowed and credited sources', ()
'mapzen',
'can-ons',
'can-saskodp',
'can-gatsudd',
'esp-aytomad',
])
assert.equal(sources[excluded], undefined, excluded);
const listed = readFileSync(new URL('files.js', WOF), 'utf8');
@@ -494,23 +497,15 @@ test('neighborhood pack ships only explicitly allowed and credited sources', ()
}
for (const [key, source] of Object.entries(sources))
assert.equal(used[key], source.records, key);
assert.deepEqual(index.meta.recordExclusions, {
'can-ons': 36,
'can-saskodp': 54,
});
const excludedIds = new Set();
for (const rule of Object.values(
WOF_LICENSE_POLICY.recordExclusions.sources,
)) {
assert.equal(rule.ids.length, rule.count);
for (const id of rule.ids) {
assert.ok(!excludedIds.has(id));
excludedIds.add(id);
assert.ok(!ids.has(id), `${id} excluded from shipped rows`);
}
}
assert.equal(excludedIds.size, 90);
assert.equal(ids.size, 61_665);
// A licence listed only as an "equivalent" of an open licence is not one.
for (const [key, source] of Object.entries(sources))
assert.doesNotMatch(source.license, /equivalent/i, key);
assert.ok(
WOF_LICENSE_POLICY.licenses.every((value) => !/equivalent/i.test(value)),
);
assert.deepEqual(index.meta.recordExclusions, {});
assert.deepEqual(WOF_LICENSE_POLICY.recordExclusions.sources, {});
assert.equal(ids.size, WOF_RECORD_COUNT);
});
test('neighborhoods resolve near the view, in any script', async () => {
+34
View File
@@ -0,0 +1,34 @@
/** Latin letters that Unicode decomposition does not fold to plain ASCII. */
const FOLD = {
ß: 'ss',
ø: 'o',
æ: 'ae',
ł: 'l',
đ: 'd',
ı: 'i',
œ: 'oe',
þ: 'th',
};
/**
* Comparable form of a place name, shared by the bundled packs, the
* OpenFreeMap street and grounds matchers and the Nominatim server: case
* folded, accents removed from Latin letters only, punctuation and symbols
* collapsed to single spaces, and a leading "the" dropped. Other scripts keep
* their marks, so "कुल मार्ग" and "काली मार्ग" stay distinct while "São Paulo",
* "sao paulo" and "SÃO PAULO!" meet.
*
* @param {unknown} value
* @returns {string}
*/
export function foldPlaceName(value) {
return String(value ?? '')
.toLowerCase()
.replace(/[ßøæłđıœþ]/g, (c) => FOLD[c])
.normalize('NFKD')
.replace(/(\p{Script=Latin})\p{M}+/gu, '$1')
.normalize('NFKC')
.replace(/[^\p{L}\p{M}\p{N}]+/gu, ' ')
.trim()
.replace(/^the /, '');
}