茲趁 2016 年台中市東勢區慶福里 12 鄰東關路四段 22 巷門牌號碼編釘， 針對山區門牌號碼規劃採取新的想法， 以區道「中45線」（及上游）燥坑為例。
[未全英譯。 Not fully translated to English.]
東關路四段 22 巷門牌 Lane 22 Dongguan Rd. Section 4 house numbering
2016 年臺中市東勢區戶政事務所編輯慶福里 12 鄰東關路四段燥坑門牌時， 用一很有參考價值的編法。
In 2016 the Dongshi District Household Registration Office of Taichung, Taiwan, chose a very interesting method to reserve house numbers in the Zao Keng valley of Qingfu Village.
Here is a Binary tree of nodes we want to number. Through it we establish a "main" path / axis (not thread) extending to an arbitrary "final" leaf node at arbitrary depth.
Pre_order 1 6 7 8 9 10 2 3 4 5 Zaokengian_order 1 2 3 4 5 6 7 8 9 10
Our Zaokengian traversal is just like the usual depth first pre-order traversal, with an exception: Imagine a main road (our path) passing through a mountain community. At each fork (no matter left or right) we first number the houses down that side road before returning to our main road. Our main road will always reach the highest numbered ("final node") house. (And maybe extend on into the next township, but that's not our concern today.)
So instead of doing the usual pre-order traversal's "choose left node, then choose right node," we ask ourselves
"is that left node on our 'main road' path? If so then instead first chose the right node, then the left node. If that left node is not on our path, then choose that left node, then the right node (no need to check if that right node is on our path now.) If there is only one node, choose it. If there are no children at all, then just stop this branch ('return()')."
as I have done in the source code, which makes different trees on each run here on GNU/Linux. Now we have assigned all the numbers to all the nodes.
Is our main road / path a "central path" / "axis"? In some respects no. It could be very short. But it must be at least one node long, else the final node won't be on it... In some respects yes. Nodes to the left and right of it are all numbered before it.
Currently (2016) I haven't found such a traverse in the literature, so hereby name it "Zaokengian traversal."
Maybe someone could write a open source GIS module that could take as input a network of roads, a starting and ending point, and would number all the future houses along them in the above fashion. Great for various housing estates, campgrounds, cemeteries, with forking non-grid streets.
Now comes the task of how to find a particular numbered node starting from the root. First let's switch back to real life to see how a car driver is supposed to deal with it.
Miguel A. Lerma of Northwestern University (IL, USA) writes:
"Left" and "right" are just labels. The traversal you describe is a pre-order depth-first traversal with the children relabeled so that all nodes in the main road are treated as "right".
In real life we need to post one sign at the corner of each side road, "'← 170-211" etc. to tell drivers where that batch of numbers will "disappear" to. Supposedly a second sign "Main Road →" or "212… →" wouldn't be needed as it would obvious which was the main road, and drivers would be assumed to know to keep on driving up the main road if the side road sign doesn't mention the range they are looking for.
The signs would be needed not only on our main road but also at (both sides of) junctions within our side roads.
Obey each sign and no backtracking will occur on your way to the destination. 下圖為未來社區地圖（未按照比例）。
Here is a map of our potential community (not to scale.)
50-100 ---------+------ / / 178 \ 187 1 / 107 147 / 215 \----+---+- +-+-主+---+-+-線-+---+-main-road \ 200 2 48 \ 168 216 240 206\ 209 \ ---+- 120-140 210
If we want to go further and try to emulate a car via an "electron" navigating our tree, besides an internal '*' marker on children nodes on our main path, we would have an extra field on the other non-main path child, containing one number: the highest number if one takes that non-main path. (The lowest number would be one more than the current number of the node we are at. (A real driver wouldn't necessarily know that, as that house might not even be built yet, or too dark. Hence a range is needed on the sign.))
Also we would be using points spaced every 50 meters along the centerlines of all roads. Each point then being assigned a pair e.g., "55,56", for odd on the left, even on the right (nothing to do with the left and right of our traversal above.)
連最小次路裡， 對面門牌仍是這面加減一。 So even on the smallest branch road, the number of a house across the street would be this house ± 1.
Stretches of roads with no junctions would be represented simply by nodes with just one child (every 50 meters). Right or left child all OK. Perhaps use slight bends in the road to determine which, or just use one consistently.
Perhaps any real four-corner (or more) junctions could be analyzed as two (or more) three-corner junctions, left first then right.
仍有四的考量… And then there are tetraphobia considerations to attend to, etc. Furthermore we had better be very sure to extend each road on our map to cover all future areas with the slightest chance of construction (to avoid running out of interstitial numbers and being forced to use e.g., "58-1" for a house "near" house 58.
最終目標為輸出一張地圖， 含所有未來門牌位置， 類似已不採納的下列 B 方案圖， 供戶政人員一旦有人申請， 能發給其正確門牌號碼。
Our final goal would be to print out a map with each future house number location marked, similar to the plan B map below. Household Registration Office officials could refer to it whenever a new number was to be issued.
我原先提案採傳統巷弄式， 估計為 146 巷 （後來命名 22 巷）， 巷內則採號距 50 公尺。 後來政府採上列無弄制。
My original plan below used the traditional lane / alley combination. This was seen as too complicated so instead the no-alley ("No. 147, Lane 22, Dongguan Road Section 4" system above was used.)
B 方案圖 Plan B Map
由於各界常反映各地道路命名及門牌編釘自治條例 「每隔四公尺至六公尺預留一個門牌號供新建房屋使用」 不適合偏遠鄉下非都市計劃地區門牌習慣， 那麼若欲採較寬之門牌距離標準， 本案參考農業用地興建農舍辦法第 2 條 「面積不得小於零點二五公頃」， 等於 50 × 50 公尺。 就是沿路左、 右邊各 50 公尺一個門牌， 一公里 20 + 20 = 40 個門牌。 自入口預留：
We try a 50 meter per house number standard -- unlike the five meter one of cities.
公尺 左,右門牌 25 1,2 75 5,6 125 7,8 175 9,10 225 11,12 275 15,16 325 17,18 ...
由於各地道路命名及門牌編釘條例 「遇有尾數為四， 戶政事務所得抽空不編。」 惟以維持市容道路左右兩邊門牌同步協調， 本案加抽尾數為三者（公式， 原始碼 。） 亦能視況， 輪抽三、五…， 或更精明「遮醜」法…
We also remove all house numbers ending 3's (3, 13, 523...) not only just the usual 4's, to keep the numbering of the two sides of the road balanced. Based on a formula we made an example query program in the source code. (We could instead alternatively remove 3, then 5, then 3... or even more complex "embarrassment hiding schemes."
茲發揮彈性， 亦避免動用「衖」， 按照地理特性， 將11弄由9弄生出。
寫本案時估計燥坑已經被命名幾號巷。 暫查臺中市道路命名及門牌編釘自治條例第九條： 右雙、每隔四公尺至六公尺預留， 那麼燥坑的路口離四段起點（區界）大約 290 公尺， 又以 5 公尺預留， 290 ÷ 5 × 2 = 116 . 再因同條例 「遇有尾數為四，戶政事務所得抽空不編」 又上述「再抽三」原則， 猜得 「東關路四段 146 巷」！
這不影響我們的門牌系統。 東關路四段 146 巷某號位置仍然是正確， 不管前加哪區， 惟從民政、警政、郵政、親民等立場， 仍應沿用東勢區。
僅針對部份台中市空間地圖查詢系統顯示現有門牌之小巷子。 其餘小巷子屆時若有必要， 能類推。 雖屬山區， 但全以平面 2D 而非立體 3D 計算， 以求簡便。
原始碼 Source code. 多靠 PostGIS 計算位置。
Depth First Search Function.
Last modified: 2020-12-15 07:18:49 +0800