技術規格書

系統主要分五大部份: 請求票網站、 API 、E-Mail Proxy 、 GeoDjango 、時間戳記伺服器。

請求票網站

使用者必須啟用 JS ,方能正常使用本網站。

創建帳號/登入

路人僅提供使用 Google/Facebook/Yahoo 登入及創建帳號。而使用 APP 創建帳號時一律使用 Google Play 帳號,詳見 ho600_tmp.resources.UserResource.obj_create 。

里長、里幹事、代表、議員帳號資料 [1] 由「開放資料集」匯入,但啟用需經服務處電話人工(網站管理員)驗證。

[1]角色明細如下 in_casting_role :

承辦人帳號則透過 E-Mail Proxy 在傳遞意見時,透過特定連結讓承辦人自建帳號 [2] , 承辦人自建帳號除可使用 GFY 登入,亦可以單位信箱建立帳號。

外包廠商則可利用承辦人所提供的兩組數字 [3] 認領 Ticket 。但認領前,一樣要使用 GFY 登入及創建帳號。且需登錄公司統編或自己的身份證號。

[2]Ticket 被分配給某個單位後, Ticket 送出問題的內文中,會包含一個特定連結,供承辦人點選後免驗證即可檢視 Ticket 內容。若使用者是使用此特定連結進入,則出現「請他創建帳號」的選項。如果他已創建過,那可以點選登入鈕,該連結一經登入或創建帳號後則立刻失效,未來再點選該連結者,都會提示他們要去跟某某承辦人要權限。若是 Ticket 被更換所屬單位,則特定連結會重新製作,並再開放由第一位點選的承辦人認領 Ticket 。
[3]第一組是 Ticket 編號加 1 碼檢查碼,第二組是 6 碼驗證數字。

Ticket 建立

地方事務 Ticket 只能透過「眼見為憑 APP」建立。若是對本系統有意見,則可在本網站創建,其所屬單位必為「敝網站」。

地方事務 Ticket 建立時,直接比對 GPS 位置以對應村里。

地方事務 Ticket 放置在 A 專案; 本系統意見 Ticket 放置在 B 專案。但對使用者前端操作而言,他們應只會注意到地方事務的 ticket 。

Ticket 分配

由所屬的里長、里幹事、代表、議員或請求票系統管理員分配 Ticket ,經分配後,也可由承辦單位回本網站改分配或退回分配人。

Ticket 處理

承辦人、外包廠商在處理 Ticket 時,可使用 Ticket 所屬的惟一電子信箱回覆意見及附件,回本網站登入後,直接在頁面上填寫意見及上傳附檔。

附檔上傳至 S3 ,其權限為不公開,每次使用者要下載時,由系統給予 1 天 [4] 內有效的下載網址。

[4]應可另定。

Ticket 結案

承辦人審核外包廠商或自辦處理後,可對 Ticket 上的所有意見逐一設定公不公開,但預設值是全部不公開。

關於 Ticket Models

需有下列 Models ,才足以紀錄所有資料。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Bundle(Ho600LibBaseModel):
    pass

class Area(Tree):
    name = M.CharField(max_length=16)

class Unit(Tree):
    name = M.CharField(max_length=128)

class File(Ho600LibBaseModel):
    pass

class Ticket(Ho600LibBaseModel):
    bundle = M.ForeignKey(Bundle)
    principal = M.ForeignKey(User, related_name='ticket_set_in_principal')
    operator = M.ForeignKey(User, related_name='ticket_set_in_operator')
    status = M.ForeignKey(Option, related_name='ticket_set_in_status')
    kind = M.ForeignKey(Option, related_name='ticket_set_in_kind')
    longitude = models.FloatField()
    latitude = models.FloatField()
    village = M.ForeignKey(Area, null=True)
    unit = M.ForeignKey(Unit, null=True)
    title = M.CharField(max_length=128, default='')
    pictures = M.ManyToManyField(File)
    content = M.TextField(default='')
    tape = M.ForeignKey(File, null=True)
    tape_content = M.TextField(default='')
    is_public = M.BooleanField(default=False)

class Reply(Ho600LibBaseModel):
    ticket = M.ForeignKey(Ticket)
    content = M.TextField(default='')
    is_public = M.BooleanField(default=False)
    files = M.ManyToManyField(File)
    old_principal = M.ForeignKey(User, related_name='reply_set_in_old_principal', null=True)
    now_principal = M.ForeignKey(User, related_name='reply_set_in_now_principal', null=True)
    old_status = M.ForeignKey(Option, related_name='reply_set_in_old_status', null=True)
    now_status = M.ForeignKey(Option, related_name='reply_set_in_now_status', null=True)
    old_kind = M.ForeignKey(Option, related_name='reply_set_in_old_kind', null=True)
    now_kind = M.ForeignKey(Option, related_name='reply_set_in_now_kind', null=True)
    old_unit = M.ForeignKey(Option, related_name='reply_set_in_old_unit', null=True)
    now_unit = M.ForeignKey(Option, related_name='reply_set_in_now_unit', null=True)

class Comment(Ho600LibBaseModel):
    ticket = M.ForeignKey(Ticket)
    reply = M.ForeignKey(Reply, null=True)
    content = M.TextField()
    scope = M.IntegerField()

API

帳號建立及驗證

路人可直接用 Google Play 帳號在安裝 APP 後,立刻以 Gmail +手機惟一碼創建帳號。

APP 創建帳號所送出的欄位:

  1. Gmail
  2. 手機惟一碼
  3. App verify key,此創建帳號 API 僅供「眼見為憑 APP」使用,所以需以此 key 驗證是否由我們 APP 送來的資料
  4. auth_key

之後的所有透過 API 傳輸的內容都需要以 auth_key 作驗證。驗證方法為 auth_value = sha1([auth_key]+連線網址+auth_key_id=ZZZ+random_id=XXX+deadline=YYY) ,auth_value 再以 GET 參數附在 request_url 中。

創建 Ticket

送出必備欄位:

  1. auth_key_id
  2. auth_value
  3. GPS
  4. 驗證過的 timestamp (待建立時間戳記伺服器,才能有此資料),或先給予手機上自定的創建時間
  5. 至少一張相片
  6. 最多一個錄音檔
  7. 問題說明

送出選填欄位:

  1. 類型(路面、堤防、水溝、路燈、電線桿、人孔蓋...),此選項需自動從本網站定期更新。

回傳欄位:

  1. ticket_id
  2. ticket_check_code
  3. 負責人
  4. 操作者
  5. 狀態
  6. 類型
  7. 對應縣市、鄉鎮市區、村里
  8. 所屬單位
  9. 標題
  10. 相片縮圖網址
  11. 相片原圖網址
  12. 內容
  13. 錄音檔網址
  14. 錄音檔逐字稿

讀取 Ticket 列表

送出必備欄位:

  1. auth_key_id
  2. auth_value

結果會回傳已公開、個人所創建的 Ticket ,其回傳欄位同創建成功回傳的欄位。但會多了回覆、評論的相關連結( :todo: hoamon 待整理)。

以 Email 創建 Reply

當 Email Proxy 收到信要轉到本系統時,須使用另一套認證方式 EmailProxyAuthentication :

傳入的欄位如下:

讀取 Reply 列表

  1. auth_key_id
  2. auth_value
  3. ticket_id
  4. ticket_check_code

讀取 Comment 列表

  1. auth_key_id
  2. auth_value
  3. ticket_id
  4. ticket_check_code

E-Mail Proxy

本來是打算以 Postfix 作為收信轉 HTTP POST 的 Proxy ,但考量實作不易且 Mail Server 管理的學問太博大精深了,先放棄了。以 Google App Engine 的 Mail Service 取代。收信地址格式如下:

  1. LM-[0-9]+-[0-9A-Z]+@www-ho600.appspotmail.com
  2. DLM-[0-9]+-[0-9A-Z]+@www-ho600.appspotmail.com
  3. TM-[0-9]+-[0-9A-Z]+@www-ho600.appspotmail.com
  4. DTM-[0-9]+-[0-9A-Z]+@www-ho600.appspotmail.com

[0-9A-Z]+ 為驗證碼,以排除垃圾信件。

當 GAE 收到如上信件,可依收信地址資料分成三部份資訊:

  • 系統代號-Ticket ID-驗證碼@www-ho600.appspotmail.com

系統代號會對應 API 的接收網址、 Ticket ID 對應那一個任務、驗證碼作為檢查用。

信件內容可分下列欄位:

  1. subject
  2. sender
  3. to
  4. cc
  5. date
  6. attachments
  7. original(除上述內容的原始信件全文)

GAE 首先將 Ticket ID 、標題、寄信地址、 to 、 cc 、寄信時間、附件檔名及內文 POST 到接收網址,然後會拿到附件檔上傳的 S3 位置,再來上傳檔案至 S3 ,完成後再 PATCH 回應 save_done = True 。

GeoDjango

PostgreSQL 需要 GEOS, PROJ.4, PostGIS

在 Ubuntu 安裝相關函式庫:

$ sudo apt-get install binutils libproj-dev libgeoip1 gdal-bin python-gdal
$ wget http://download.osgeo.org/geos/geos-3.3.8.tar.bz2
$ tar jxf geos-3.3.8.tar.bz2
$ cd geos-3.3.8
$ ./configure
$ make
$ sudo make install
$ cd ..
$ wget http://download.osgeo.org/proj/proj-4.8.0.tar.gz
$ wget http://download.osgeo.org/proj/proj-datumgrid-1.5.tar.gz
$ tar xzf proj-4.8.0.tar.gz
$ cd proj-4.8.0/nad
$ tar xzf ../../proj-datumgrid-1.5.tar.gz
$ cd ..
$ ./configure
$ make
$ sudo make install
$ cd ..
$ wget http://download.osgeo.org/gdal/gdal-1.9.2.tar.gz
$ tar xzf gdal-1.9.2.tar.gz
$ cd gdal-1.9.2
$ ./configure
$ make # Go get some coffee, this takes a while.
$ sudo make install
$ cd ..
$ wget http://download.osgeo.org/postgis/source/postgis-2.1.3.tar.gz # Ubuntu 14.04 works, but 12.04 not
$ tar -zxf postgis-2.0.3.tar.gz
$ cd postgis-2.0.3/
$ ./configure
$ make
$ sudo make install
$ #此法安裝 postgis-2.0 後,會在 Ubuntu 12.04 上出現 undefined symbol: pj_get_spheroid_defn ,
$ sudo apt-get install postgresql-9.3-postgis-2.1 # but Ubuntu 14.04 does not work

創建樣版資料庫 template_postgis 。以後要開有使用 PostGis 的資料庫可直接複製該樣版。

$ createdb -E UTF8 --lc-collate=zh_TW.UTF-8 --lc-ctype=zh_TW.UTF-8 -T template0 template_postgis
$ createlang -d template_postgis plpgsql
$
$ psql -d postgres -c "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis';"
$ POSTGIS_SQL_PATH=`pg_config --sharedir`/contrib/postgis-2.1
$ psql -d template_postgis -f $POSTGIS_SQL_PATH/postgis.sql
$ psql -d template_postgis -f $POSTGIS_SQL_PATH/spatial_ref_sys.sql
$ #如使用的是 AWS PG RDS 的話,上面四行請改以下方文件說明處理
$ #http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.PostGIS
$
$ psql -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;"
$ psql -d template_postgis -c "GRANT ALL ON geography_columns TO PUBLIC;"
$ psql -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;"
$ createdb -T template_postgis test_magpie

再來是以 all_taiwan_village_border/102_05_21_TWD97_121.shp 資料自動產生 Django Model:

$ ./manage.py ogrinspect ../docs/open-data/all_taiwan_village_border/102_05_21_TWD97_121.shp \
VillageBorder --mapping --multi > village_border.py

village_border.py 的內容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from django.contrib.gis.db import models as M
# This is an auto-generated Django model module created by ogrinspect.
class VillageBorder(M.Model):
    obj_id = M.CharField(max_length=10)
    objectid_1 = M.IntegerField()
    village = M.CharField(max_length=50)
    town = M.CharField(max_length=50)
    county = M.CharField(max_length=50)
    village_id = M.CharField(max_length=48)
    town_id = M.CharField(max_length=48)
    county_id = M.CharField(max_length=48)
    tv_all = M.CharField(max_length=150)
    villcode = M.CharField(max_length=16)
    ori_villag = M.CharField(max_length=50)
    area = M.FloatField()
    max_x = M.FloatField()
    max_y = M.FloatField()
    min_x = M.FloatField()
    min_y = M.FloatField()
    x = M.FloatField()
    y = M.FloatField()
    v_id = M.CharField(max_length=20)
    sort = M.FloatField()
    countyname = M.CharField(max_length=8)
    townname = M.CharField(max_length=8)
    objectid = M.IntegerField()
    orig_fid = M.IntegerField()
    shape_leng = M.FloatField()
    shape_le_1 = M.FloatField()
    shape_area = M.FloatField()
    et_id = M.IntegerField()
    geom = M.MultiPolygonField(srid=-1)
    objects = M.GeoManager()



# Auto-generated `LayerMapping` dictionary for VillageBorder model
VILLAGEBORDER_MAPPING = {
    'obj_id' : 'ID',
    'objectid_1' : 'OBJECTID_1',
    'village' : 'VILLAGE',
    'town' : 'TOWN',
    'county' : 'COUNTY',
    'village_id' : 'VILLAGE_ID',
    'town_id' : 'TOWN_ID',
    'county_id' : 'COUNTY_ID',
    'tv_all' : 'TV_ALL',
    'villcode' : 'VILLCODE',
    'ori_villag' : 'ORI_VILLAG',
    'area' : 'AREA',
    'max_x' : 'MAX_X',
    'max_y' : 'MAX_Y',
    'min_x' : 'MIN_X',
    'min_y' : 'MIN_Y',
    'x' : 'X',
    'y' : 'Y',
    'v_id' : 'V_ID',
    'sort' : 'SORT',
    'countyname' : 'COUNTYNAME',
    'townname' : 'TOWNNAME',
    'objectid' : 'OBJECTID',
    'orig_fid' : 'ORIG_FID',
    'shape_leng' : 'Shape_Leng',
    'shape_le_1' : 'Shape_Le_1',
    'shape_area' : 'Shape_Area',
    'et_id' : 'ET_ID',
    'geom' : 'MULTIPOLYGON',
}

再來利用 import_2014_village_border.py ,即可匯入 all_taiwan_village_border 資料:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# -*- coding: utf-8 -*-

import os
from django.core.management.base import BaseCommand, CommandError
from django.contrib.gis.utils import LayerMapping
from django.conf import settings
from django.utils.timezone import now, utc

from magpie.models import M, Option, Unit, Area, Casting, VillageBorder, VILLAGEBORDER_MAPPING



class Command(BaseCommand):
    help = ''


    def handle(self, *args, **kw):
        """ Command Example:

            ./manage.py import_2014_village_border
        """
        village_shp = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                    '..', '..', '..', 'docs', 'open-data',
                                    'taiwan_village_border_TPKM-lat-and-long',
                                    '102_05_21_lat_and_long.shp')
        lm = LayerMapping(VillageBorder, village_shp, VILLAGEBORDER_MAPPING, transform=False, encoding='utf-8')
        lm.save(strict=True, verbose=True)

        vb = VillageBorder.objects.get(objectid_1=488)
        vb.village = u'崎峰村'
        vb.tv_all = u'林邊鄉崎峰村'
        vb.save()

        for area in Area.objects.all().order_by('id'):
            try:
                village_name = area.name
                town_name = area.parent.name
                city_name = area.parent.parent.name
            except AttributeError:
                name = area.name
                parent = area.parent
                while parent:
                    name = parent.name + name
                    parent = parent.parent
                print 'AttributeError: %s' % (name)
            else:
                if city_name in ['2010', '2014']: continue
                try:
                    vb = VillageBorder.objects.get(county__in=[city_name, city_name.replace(u'台', u'臺')],
                                                    town=town_name,
                                                    village=village_name)
                except VillageBorder.DoesNotExist:
                    print 'No VillageBorder: %s%s%s' % (city_name, town_name, village_name)
                except VillageBorder.MultipleObjectsReturned:
                    print 'MultipleObjectsReturned: %s%s%s' % (city_name, town_name, village_name)
                else:
                    area.border = vb
                    area.save()

我們資料庫內的 GPS 座標格式( all_taiwan_village_border, taiwan_village_border_TPKM )為「二度分帶: TWD97 TM2 台灣」格式,一般在 Google Maps 上所查到的 GPS 格式則為「經緯度: TWD97/WGS84」格式。以我的舊家為例,其 Google Maps 上報的是 23.965404, 120.971702 ,經轉換格式後為 247120.147, 2651192.014 。而查詢所在村里的方法如下:

>>> from django.contrib.gis.geos import Point
>>> p = Point(247120.147, 2651192.014)
>>> vb = VillageBorder.objects.get(geom__intersects=p) #匯入資料須為 taiwan_village_border_TPKM.shp
>>> print vb.village
東門里
>>> area = vb.in_area_model.get()
>>> print area.parent.parent.name, area.parent.name, area.name
南投縣 埔里鎮 東門里

另外在 taiwan_village_border_TPKM-lat-and-long 資料集中的格式是 WGS84 ,可直接以 Google Maps 所得座標查詢:

>>> from django.contrib.gis.geos import Point
>>> p = Point(120.971702, 23.965404)
>>> vb = VillageBorder.objects.get(geom__intersects=p) #匯入資料須為 taiwan_village_border_TPKM-lat-and-long.shp
>>> print vb.village
東門里
>>> area = vb.in_area_model.get()
>>> print area.parent.parent.name, area.parent.name, area.name
南投縣 埔里鎮 東門里

本系統內所使用的座標資料為 taiwan_village_border_TPKM-lat-and-long 資料集。

以下是 2010 村里無法對應至 TWD97 的村里邊界資料:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
No VillageBorder: 台北市萬華區糖廍里
No VillageBorder: 高雄市左營區廍北里
No VillageBorder: 高雄市左營區廍南里
No VillageBorder: 高雄市鳥松區坔埔里
No VillageBorder: 高雄市阿蓮區峯山里
No VillageBorder: 高雄市湖內區公舘里
No VillageBorder: 高雄市那瑪夏區達卡努瓦里
No VillageBorder: 新北市板橋區公館里
No VillageBorder: 新北市中和區瓦磘里
No VillageBorder: 新北市中和區灰磘里
No VillageBorder: 新北市永和區新廍里
No VillageBorder: 新北市新店區五峰里
No VillageBorder: 新北市樹林區獇寮里
No VillageBorder: 新北市三峽區永舘里
No VillageBorder: 新北市瑞芳區爪峯里
No VillageBorder: 新北市瑞芳區濂新里
No VillageBorder: 新北市瑞芳區濂洞里
No VillageBorder: 新北市土城區峯廷里
No VillageBorder: 新北市坪林區石[石曹]里
No VillageBorder: 新北市萬里區崁脚里
No VillageBorder: 台中市西區公舘里
No VillageBorder: 台中市西區双龍里
No VillageBorder: 台中市北屯區廍子里
No VillageBorder: 台中市清水區槺榔里
No VillageBorder: 台中市外埔區廍子里
No VillageBorder: 台中市大安區龜里
No VillageBorder: 台中市大肚區蔗廍里
No VillageBorder: 台南市新營區舊廍里
No VillageBorder: 台南市後壁區後廍里
No VillageBorder: 台南市麻豆區晋江里
No VillageBorder: 台南市麻豆區寮廍里
No VillageBorder: 台南市官田區南廍里
No VillageBorder: 台南市佳里區頂廍里
No VillageBorder: 台南市西港區檨林里
No VillageBorder: 台南市七股區塩埕里
No VillageBorder: 台南市七股區槺榔里
No VillageBorder: 台南市新化區山脚里
No VillageBorder: 台南市新化區[上廿下那]拔里
No VillageBorder: 台南市山上區玉峯里
No VillageBorder: 台南市龍崎區石[石曹]里
No VillageBorder: 台南市永康區塩行里
No VillageBorder: 台南市永康區塩洲里
No VillageBorder: 台南市安南區[土昷]南里
No VillageBorder: 台南市安南區塩田里
No VillageBorder: 台南市安南區公[土昷]里
No VillageBorder: 宜蘭縣蘇澳鎮岳明里
No VillageBorder: 桃園縣大園鄉菓林村
No VillageBorder: 桃園縣新屋鄉槺榔村
No VillageBorder: 新竹縣竹東鎮上館里
No VillageBorder: 新竹縣竹東鎮雞林里
No VillageBorder: 新竹縣北埔鄉水磜村
No VillageBorder: 苗栗縣苑裡鎮山腳里
No VillageBorder: 苗栗縣苑裡鎮上館里
No VillageBorder: 苗栗縣竹南鎮公館里
No VillageBorder: 苗栗縣三義鄉双湖村
No VillageBorder: 苗栗縣三義鄉双潭村
No VillageBorder: 彰化縣彰化市下廍里
No VillageBorder: 彰化縣彰化市磚磘里
No VillageBorder: 彰化縣彰化市南瑤里
No VillageBorder: 彰化縣彰化市寶廍里
MultipleObjectsReturned: 彰化縣花壇鄉灣雅村
MultipleObjectsReturned: 彰化縣芬園鄉嘉興村
No VillageBorder: 彰化縣員林鎮大峯里
No VillageBorder: 彰化縣埔鹽鄉廍子村
No VillageBorder: 彰化縣埔鹽鄉瓦磘村
No VillageBorder: 彰化縣埔心鄉舊舘村
No VillageBorder: 彰化縣埔心鄉南舘村
No VillageBorder: 彰化縣埔心鄉新舘村
No VillageBorder: 彰化縣埔心鄉埤腳村
No VillageBorder: 彰化縣二水鄉上豊村
No VillageBorder: 彰化縣芳苑鄉頂廍村
No VillageBorder: 南投縣竹山鎮硘磘里
No VillageBorder: 南投縣名間鄉廍下村
No VillageBorder: 雲林縣斗六市崙峯里
No VillageBorder: 雲林縣西螺鎮公舘里
No VillageBorder: 雲林縣北港鎮公舘里
No VillageBorder: 雲林縣麥寮鄉瓦磘村
No VillageBorder: 雲林縣台西鄉台西村
No VillageBorder: 雲林縣台西鄉海北村
No VillageBorder: 雲林縣台西鄉海南村
No VillageBorder: 雲林縣台西鄉海口村
No VillageBorder: 雲林縣台西鄉溪頂村
No VillageBorder: 雲林縣台西鄉牛厝村
No VillageBorder: 雲林縣台西鄉泉州村
No VillageBorder: 雲林縣台西鄉光華村
No VillageBorder: 雲林縣台西鄉五榔村
No VillageBorder: 雲林縣台西鄉山寮村
No VillageBorder: 雲林縣台西鄉富琦村
No VillageBorder: 雲林縣台西鄉永豐村
No VillageBorder: 雲林縣台西鄉和豐村
No VillageBorder: 雲林縣台西鄉蚊港村
No VillageBorder: 雲林縣台西鄉五港村
No VillageBorder: 雲林縣元長鄉瓦磘村
No VillageBorder: 雲林縣四湖鄉萡子村
No VillageBorder: 雲林縣四湖鄉萡東村
No VillageBorder: 雲林縣水林鄉欍埔村
No VillageBorder: 嘉義縣朴子市双溪里
No VillageBorder: 嘉義縣民雄鄉双福村
No VillageBorder: 嘉義縣中埔鄉塩舘村
No VillageBorder: 嘉義縣中埔鄉石硦村
No VillageBorder: 嘉義縣竹崎鄉文峯村
No VillageBorder: 嘉義縣梅山鄉双溪村
No VillageBorder: 嘉義縣梅山鄉瑞峯村
No VillageBorder: 屏東縣東港鎮下廍里
No VillageBorder: 屏東縣萬丹鄉厦北村
No VillageBorder: 屏東縣萬丹鄉厦南村
No VillageBorder: 屏東縣里港鄉三廍村
No VillageBorder: 屏東縣新園鄉瓦磘村
No VillageBorder: 屏東縣林邊鄉崎峯村
No VillageBorder: 屏東縣滿州鄉响林村
No VillageBorder: 屏東縣瑪家鄉凉山村
No VillageBorder: 台東縣台東市富岡里
No VillageBorder: 台東縣台東市富豐里
No VillageBorder: 台東縣台東市岩灣里
No VillageBorder: 台東縣台東市南王里
No VillageBorder: 台東縣台東市卑南里
No VillageBorder: 台東縣台東市南榮里
No VillageBorder: 台東縣台東市新生里
No VillageBorder: 台東縣台東市民生里
No VillageBorder: 台東縣台東市寶桑里
No VillageBorder: 台東縣台東市馬蘭里
No VillageBorder: 台東縣台東市中心里
No VillageBorder: 台東縣台東市自強里
No VillageBorder: 台東縣台東市民族里
No VillageBorder: 台東縣台東市四維里
No VillageBorder: 台東縣台東市中華里
No VillageBorder: 台東縣台東市強國里
No VillageBorder: 台東縣台東市建國里
No VillageBorder: 台東縣台東市民權里
No VillageBorder: 台東縣台東市仁愛里
No VillageBorder: 台東縣台東市中正里
No VillageBorder: 台東縣台東市大同里
No VillageBorder: 台東縣台東市成功里
No VillageBorder: 台東縣台東市文化里
No VillageBorder: 台東縣台東市中山里
No VillageBorder: 台東縣台東市復國里
No VillageBorder: 台東縣台東市興國里
No VillageBorder: 台東縣台東市復興里
No VillageBorder: 台東縣台東市鐵花里
No VillageBorder: 台東縣台東市新園里
No VillageBorder: 台東縣台東市豐田里
No VillageBorder: 台東縣台東市豐年里
No VillageBorder: 台東縣台東市光明里
No VillageBorder: 台東縣台東市豐樂里
No VillageBorder: 台東縣台東市永樂里
No VillageBorder: 台東縣台東市康樂里
No VillageBorder: 台東縣台東市東海里
No VillageBorder: 台東縣台東市新興里
No VillageBorder: 台東縣台東市豐榮里
No VillageBorder: 台東縣台東市豐谷里
No VillageBorder: 台東縣台東市豐里里
No VillageBorder: 台東縣台東市豐原里
No VillageBorder: 台東縣台東市建和里
No VillageBorder: 台東縣台東市建興里
No VillageBorder: 台東縣台東市建業里
No VillageBorder: 台東縣台東市知本里
No VillageBorder: 台東縣台東市建農里
No VillageBorder: 台東縣關山鎮里壠里
No VillageBorder: 台東縣綠島鄉公舘村
No VillageBorder: 台東縣達仁鄉台坂村
No VillageBorder: 台東縣達仁鄉土坂村
No VillageBorder: 澎湖縣馬公市嵵裡里
No VillageBorder: 澎湖縣湖西鄉菓葉村
MultipleObjectsReturned: 新竹市北區古賢里
No VillageBorder: 嘉義市西區磚磘里
No VillageBorder: 連江縣北竿鄉(土反)里村
No VillageBorder: 金門縣金城鎮東門里
No VillageBorder: 金門縣金城鎮西門里
No VillageBorder: 金門縣金城鎮南門里
No VillageBorder: 金門縣金城鎮北門里
No VillageBorder: 金門縣烏坵鄉大坵村
No VillageBorder: 金門縣烏坵鄉小坵村

時間戳記伺服器