2012年9月25日 星期二

認識 自訂搜尋, Google Custom Search (CSE)

Google Custom Search (CSE)


專案有一個需求, 要查詢與目前觀看的文章有相關的blog , 完成後的畫面如下:

我的設定方式是, 先用 google 登入後, 到 Google Custom Search (CSE) 的 URL 裡, 按要建立自訂搜尋引擎:
http://www.google.com/cse

接著, 在包含網站裡打入這些值:

*.edu.tw/*blog*
*.edu.tw/*travel*
funp.com.tw/blogs/*
blog.roodo.com/*
*.gov.tw/*travel*
*.gov.tw/*blog*
*.com.tw/*blog*
*.myblog.yahoo.com/*
blog.udn.com/*
blog.xuite.net/*
*.wretch.cc/blog*
*.pixnet.net/*
*.blog.yahoo.com/*
*.blogspot.com/*
說明1: 原本有加入 *.com/*travel* 和 *.com.tw/*travel*, 但旅行社的網頁太多, 所以刪掉了.
說明2: 原本有加入 *.com/*blog* 但當要查詢的資料剛好都是英文時, 會查到國外的資料, 所以也刪掉.


由於不想連到旅行社相關的網站, 所以把這些網址排除.
*.gloriatour.com.tw/*
*.etholiday.com/*
*.protour.com.tw/*
*.fantasy-tours.com/*
*.tahsintour.com.tw/*
*.jptravel.com.tw/*
*.travel4u.com.tw/*
*.royaljetway.com.tw/*
*.eztravel.com.tw/*
*.eztour.com.tw/*
*.pktravel.com.tw/*
*.besttour.com.tw/*
*.colatour.com.tw/*
travel.com.tw/*
*.lifetour.com.tw/*
*.ftstour.com.tw/*
*.settour.com.tw/*
*.liontravel.com/*
*.startravel.com.tw/*
*.phoenix.com.tw/*


相關文章:

自訂搜尋引擎


URL patterns

Google自訂搜尋引擎 - 打造個人資訊檢索系統

[SQL].2個經緯度坐標,計算直線距離


有一個專案需求是, 可以查詢某中心點 2000公尺內的景點, 之前是用 between 取出資料, 但取出的資料, 無法按照距離做排序, 所以還是乖乖地透過 SQL 把距離算出來.

計算坐標距離的 SQL 呼叫範例:
SELECT
  htx.ID, Longitude, Latitude
  ,acos(sin(radians(24.80181500042168)) * sin(radians(Latitude )) + cos(radians(24.80181500042168)) * cos(radians(Latitude )) * cos(radians(120.971596999978 - Longitude))) * 6372.8
as rout_distance
  , 24.80181500042168 as route_lat
  , 120.971596999978 as route_lon
FROM Info htx 
WHERE
(Longitude BETWEEN 120.961801499978 
AND 120.981392499978) and(Latitude BETWEEN 24.7928168004217 
AND 24.8108132004217) order by rout_distance , Type desc , Name
說明1: 24.80181500042168 是我要查詢的中心點 LAT, 120.971596999978 是我的中心點 LON.

說明2: 原本用來取距離是用 between 取, 但這有一個問題, 就是在正方向角角的, 其實會超過預設的距離.


ASP 關於 sql 組合的程式碼如下:
, acos(sin(radians("& me.route_lat &")) * sin(radians(HotelLatitude )) + cos(radians("& me.route_lat &")) * cos(radians(HotelLatitude )) * cos(radians("& me.route_lon &" - HotelLongitude))) * 6372.8 as rout_distance


專案的畫面如下:


資料來源:
Distance-based JOIN given Latitude/Longitude
http://stackoverflow.com/questions/8947998/distance-based-join-given-latitude-longitude

2012年9月18日 星期二

[XSL].2個經緯度坐標,計算直線距離

Calculate distance between two points with latitude and longitude coordinates

請增加紅色的文字, 到你的 xsl 裡.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:user="urn:user-namespace-here" version="1.0">
 

xsl 呼叫範例:
<xsl:value-of select="user:distance(concat($lat1,''),concat($lon1,''),concat($lat2,''),concat($lon2,''))"/> 公尺


xsl 的 javascript function:
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function distance(lat1,lon1,lat2,lon2) {
    var R = 6371;
    var dLat = (lat2-lat1) * Math.PI / 180;
    var dLon = (lon2-lon1) * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1 * Math.PI / 180 ) * Math.cos(lat2 * Math.PI / 180 ) * Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return Math.round(d*1000);
}
]]>
</msxsl:script>

資料來源:
Calculate distance between two points with latitude and longitude coordinates
http://snipplr.com/view/25479/
+
How to include javaScript file in xslt
http://stackoverflow.com/questions/7444317/how-to-include-javascript-file-in-xslt

[javascript].2個經緯度坐標,計算直線距離

Calculate distance between two points with latitude and longitude coordinates

function distance(lat1,lon1,lat2,lon2) {
 var R = 6371; // km (change this constant to get miles)
 var dLat = (lat2-lat1) * Math.PI / 180;
 var dLon = (lon2-lon1) * Math.PI / 180;
 var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  Math.cos(lat1 * Math.PI / 180 ) * Math.cos(lat2 * Math.PI / 180 ) *
  Math.sin(dLon/2) * Math.sin(dLon/2);
 var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
 var d = R * c;
 if (d>1) return Math.round(d)+"km";
 else if (d<=1) return Math.round(d*1000)+"m";
 return d;
}

資料來源:
http://snipplr.com/view/25479/

[ASP].2個經緯度坐標,計算直線距離

ASP Calculate distance between two points given latitude / longitude

':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::                                                                         :::
':::  This routine calculates the distance between two points (given the     :::
':::  latitude/longitude of those points). It is being used to calculate     :::
':::  the distance between two ZIP Codes or Postal Codes using our           :::
':::  ZIPCodeWorld(TM) and PostalCodeWorld(TM) products.                     :::
':::                                                                         :::
':::  Definitions:                                                           :::
':::    South latitudes are negative, east longitudes are positive           :::
':::                                                                         :::
':::  Passed to function:                                                    :::
':::    lat1, lon1 = Latitude and Longitude of point 1 (in decimal degrees)  :::
':::    lat2, lon2 = Latitude and Longitude of point 2 (in decimal degrees)  :::
':::    unit = the unit you desire for results                               :::
':::           where: 'M' is statute miles                                   :::
':::                  'K' is kilometers (default)                            :::
':::                  'N' is nautical miles                                  :::
':::                                                                         :::
':::  United States ZIP Code/ Canadian Postal Code databases with latitude   :::
':::  & longitude are available at http://www.zipcodeworld.com               :::
':::                                                                         :::
':::  For enquiries, please contact sales@zipcodeworld.com                   :::
':::                                                                         :::
':::  Official Web site: http://www.zipcodeworld.com                         :::
':::                                                                         :::
':::  Hexa Software Development Center c All Rights Reserved 2004            :::
':::                                                                         :::
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
const pi = 3.14159265358979323846
 
Function distance(lat1, lon1, lat2, lon2, unit)
  Dim theta, dist
  theta = lon1 - lon2
  dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta))
  dist = acos(dist)
  dist = rad2deg(dist)
  distance = dist * 60 * 1.1515
  Select Case ucase(unit)
    Case "K"
      distance = distance * 1.609344
    Case "N"
      distance = distance * 0.8684
  End Select
End Function 
 
 
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function get the arccos function from arctan function    :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function acos(rad)
  If Abs(rad) <> 1 Then
    acos = pi/2 - Atn(rad / Sqr(1 - rad * rad))
  ElseIf rad = -1 Then
    acos = pi
  End If
End function
 
 
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function converts decimal degrees to radians             :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function deg2rad(Deg)
 deg2rad = cdbl(Deg * pi / 180)
End Function
 
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::  This function converts radians to decimal degrees             :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function rad2deg(Rad)
 rad2deg = cdbl(Rad * 180 / pi)
End Function
 
'response.write distance(32.9697, -96.80322, 29.46786, -98.53506, "M") & " Miles<br>"
'response.write distance(32.9697, -96.80322, 29.46786, -98.53506, "K") & " Kilometers<br>"
'response.write distance(32.9697, -96.80322, 29.46786, -98.53506, "N") & " Nautical Miles<br>"
%>

資料來源:
http://snipplr.com/view/1534/

2012年9月13日 星期四

透過Javascript 裡 Array 的 push 方法, 改善程式的可維護性

專案裡有一個需,有一個查詢用的表單, 要允許使用者查詢台灣的縣市+鄉鎮, 而且下拉框要聯動, 很久以前, 在台灣五都整併後, 我有參考郵局網頁裡的javascript的寫法, 但是有小小的問題, 參考如下:
說明: 郵局把宜蘭出現的位置放在很下面, 我猜測應該是把宜蘭定義為台灣"東部", 但這個專案裡宜蘭是定義在 "北部", 應該要出現在 "桃園縣" 的上方.


原本的javascript 程式碼如下:
function initialCityOptionTW(){
    cityarea_account[0] = 0;
    cityarea[1] = '仁愛區';
    cityarea[2] = '信義區';
    cityarea[3] = '中正區';
    cityarea[4] = '中山區';
    cityarea[5] = '安樂區';
    cityarea[6] = '暖暖區';
    cityarea[7] = '七堵區';
    cityarea_account[1] = 7;
    cityarea[8] = '中正區';
    cityarea[9] = '大同區';
    cityarea[10] = '中山區';
    cityarea[11] = '松山區';
    cityarea[12] = '大安區';
    cityarea[13] = '萬華區';
    cityarea[14] = '信義區';
    cityarea[15] = '士林區';
    cityarea[16] = '北投區';
    cityarea[17] = '內湖區';
    cityarea[18] = '南港區';
    cityarea[19] = '文山區';
    cityarea_account[2] = 19;
    cityarea[20] = '萬里區';
    cityarea[21] = '金山區';
    cityarea[22] = '板橋區';
    cityarea[23] = '汐止區';
    cityarea[24] = '深坑區';
    cityarea[25] = '石碇區';
    cityarea[26] = '瑞芳區';
    cityarea[27] = '平溪區';
    cityarea[28] = '雙溪區';
    cityarea[29] = '貢寮區';
    cityarea[30] = '新店區';
    cityarea[31] = '坪林區';
    cityarea[32] = '烏來區';
    cityarea[33] = '永和區';
    cityarea[34] = '中和區';
    cityarea[35] = '土城區';
    cityarea[36] = '三峽區';
    cityarea[37] = '樹林區';
    cityarea[38] = '鶯歌區';
    cityarea[39] = '三重區';
    cityarea[40] = '新莊區';
    cityarea[41] = '泰山區';
    cityarea[42] = '林口區';
    cityarea[43] = '蘆洲區';
    cityarea[44] = '五股區';
    cityarea[45] = '八里區';
    cityarea[46] = '淡水區';
    cityarea[47] = '三芝區';
    cityarea[48] = '石門區';
    cityarea_account[3] = 48;
    cityarea[49] = '中壢市';
    cityarea[50] = '平鎮市';
    cityarea[51] = '龍潭鄉';
    cityarea[52] = '楊梅市';
    cityarea[53] = '新屋鄉';
    cityarea[54] = '觀音鄉';
    cityarea[55] = '桃園市';
    cityarea[56] = '龜山鄉';
    cityarea[57] = '八德市';
    cityarea[58] = '大溪鎮';
    cityarea[59] = '復興鄉';
    cityarea[60] = '大園鄉';
    cityarea[61] = '蘆竹鄉';
    cityarea_account[4] = 61;
    cityarea[62] = '東區';
    cityarea[63] = '北區';
    cityarea[64] = '香山區';
    cityarea_account[5] = 64;
    cityarea[65] = '竹北市';
    cityarea[66] = '湖口鄉';
    cityarea[67] = '新豐鄉';
    cityarea[68] = '新埔鎮';
    cityarea[69] = '關西鎮';
    cityarea[70] = '芎林鄉';
    cityarea[71] = '寶山鄉';
    cityarea[72] = '竹東鎮';
    cityarea[73] = '五峰鄉';
    cityarea[74] = '橫山鄉';
    cityarea[75] = '尖石鄉';
    cityarea[76] = '北埔鄉';
    cityarea[77] = '峨眉鄉';
    cityarea_account[6] = 77;
    cityarea[78] = '竹南鎮';
    cityarea[79] = '頭份鎮';
    cityarea[80] = '三灣鄉';
    cityarea[81] = '南庄鄉';
    cityarea[82] = '獅潭鄉';
    cityarea[83] = '後龍鎮';
    cityarea[84] = '通霄鎮';
    cityarea[85] = '苑裡鎮';
    cityarea[86] = '苗栗市';
    cityarea[87] = '造橋鄉';
    cityarea[88] = '頭屋鄉';
    cityarea[89] = '公館鄉';
    cityarea[90] = '大湖鄉';
    cityarea[91] = '泰安鄉';
    cityarea[92] = '銅鑼鄉';
    cityarea[93] = '三義鄉';
    cityarea[94] = '西湖鄉';
    cityarea[95] = '卓蘭鎮';
    cityarea_account[7] = 95;
    cityarea[96] = '中區';
    cityarea[97] = '東區';
    cityarea[98] = '南區';
    cityarea[99] = '西區';
    cityarea[100] = '北區';
    cityarea[101] = '北屯區';
    cityarea[102] = '西屯區';
    cityarea[103] = '南屯區';
    cityarea[104] = '太平區';
    cityarea[105] = '大里區';
    cityarea[106] = '霧峰區';
    cityarea[107] = '烏日區';
    cityarea[108] = '豐原區';
    cityarea[109] = '后里區';
    cityarea[110] = '石岡區';
    cityarea[111] = '東勢區';
    cityarea[112] = '和平區';
    cityarea[113] = '新社區';
    cityarea[114] = '潭子區';
    cityarea[115] = '大雅區';
    cityarea[116] = '神岡區';
    cityarea[117] = '大肚區';
    cityarea[118] = '沙鹿區';
    cityarea[119] = '龍井區';
    cityarea[120] = '梧棲區';
    cityarea[121] = '清水區';
    cityarea[122] = '大甲區';
    cityarea[123] = '外埔區';
    cityarea[124] = '大安區';
    cityarea_account[8] = 124;
    cityarea[125] = '彰化市';
    cityarea[126] = '芬園鄉';
    cityarea[127] = '花壇鄉';
    cityarea[128] = '秀水鄉';
    cityarea[129] = '鹿港鎮';
    cityarea[130] = '福興鄉';
    cityarea[131] = '線西鄉';
    cityarea[132] = '和美鎮';
    cityarea[133] = '伸港鄉';
    cityarea[134] = '員林鎮';
    cityarea[135] = '社頭鄉';
    cityarea[136] = '永靖鄉';
    cityarea[137] = '埔心鄉';
    cityarea[138] = '溪湖鎮';
    cityarea[139] = '大村鄉';
    cityarea[140] = '埔鹽鄉';
    cityarea[141] = '田中鎮';
    cityarea[142] = '北斗鎮';
    cityarea[143] = '田尾鄉';
    cityarea[144] = '埤頭鄉';
    cityarea[145] = '溪州鄉';
    cityarea[146] = '竹塘鄉';
    cityarea[147] = '二林鎮';
    cityarea[148] = '大城鄉';
    cityarea[149] = '芳苑鄉';
    cityarea[150] = '二水鄉';
    cityarea_account[9] = 150;
    cityarea[151] = '南投市';
    cityarea[152] = '中寮鄉';
    cityarea[153] = '草屯鎮';
    cityarea[154] = '國姓鄉';
    cityarea[155] = '埔里鎮';
    cityarea[156] = '仁愛鄉';
    cityarea[157] = '名間鄉';
    cityarea[158] = '集集鎮';
    cityarea[159] = '水里鄉';
    cityarea[160] = '魚池鄉';
    cityarea[161] = '信義鄉';
    cityarea[162] = '竹山鎮';
    cityarea[163] = '鹿谷鄉';
    cityarea_account[10] = 163;
    cityarea[164] = '斗南鎮';
    cityarea[165] = '大埤鄉';
    cityarea[166] = '虎尾鎮';
    cityarea[167] = '土庫鎮';
    cityarea[168] = '褒忠鄉';
    cityarea[169] = '東勢鄉';
    cityarea[170] = '台西鄉';
    cityarea[171] = '崙背鄉';
    cityarea[172] = '麥寮鄉';
    cityarea[173] = '斗六市';
    cityarea[174] = '林內鄉';
    cityarea[175] = '古坑鄉';
    cityarea[176] = '莿桐鄉';
    cityarea[177] = '西螺鎮';
    cityarea[178] = '二崙鄉';
    cityarea[179] = '北港鎮';
    cityarea[180] = '水林鄉';
    cityarea[181] = '口湖鄉';
    cityarea[182] = '四湖鄉';
    cityarea[183] = '元長鄉';
    cityarea_account[11] = 183;
    cityarea[184] = '東區';
    cityarea[185] = '西區';
    cityarea_account[12] = 185;
    cityarea[186] = '番路鄉';
    cityarea[187] = '梅山鄉';
    cityarea[188] = '竹崎鄉';
    cityarea[189] = '阿里山鄉';
    cityarea[190] = '中埔鄉';
    cityarea[191] = '大埔鄉';
    cityarea[192] = '水上鄉';
    cityarea[193] = '鹿草鄉';
    cityarea[194] = '太保市';
    cityarea[195] = '朴子市';
    cityarea[196] = '東石鄉';
    cityarea[197] = '六腳鄉';
    cityarea[198] = '新港鄉';
    cityarea[199] = '民雄鄉';
    cityarea[200] = '大林鎮';
    cityarea[201] = '溪口鄉';
    cityarea[202] = '義竹鄉';
    cityarea[203] = '布袋鎮';
    cityarea_account[13] = 203;
    cityarea[204] = '中西區';
    cityarea[205] = '東區';
    cityarea[206] = '南區';
    cityarea[207] = '北區';
    cityarea[208] = '安平區';
    cityarea[209] = '安南區';
    cityarea[210] = '永康區';
    cityarea[211] = '歸仁區';
    cityarea[212] = '新化區';
    cityarea[213] = '左鎮區';
    cityarea[214] = '玉井區';
    cityarea[215] = '楠西區';
    cityarea[216] = '南化區';
    cityarea[217] = '仁德區';
    cityarea[218] = '關廟區';
    cityarea[219] = '龍崎區';
    cityarea[220] = '官田區';
    cityarea[221] = '麻豆區';
    cityarea[222] = '佳里區';
    cityarea[223] = '西港區';
    cityarea[224] = '七股區';
    cityarea[225] = '將軍區';
    cityarea[226] = '學甲區';
    cityarea[227] = '北門區';
    cityarea[228] = '新營區';
    cityarea[229] = '後壁區';
    cityarea[230] = '白河區';
    cityarea[231] = '東山區';
    cityarea[232] = '六甲區';
    cityarea[233] = '下營區';
    cityarea[234] = '柳營區';
    cityarea[235] = '鹽水區';
    cityarea[236] = '善化區';
    cityarea[237] = '大內區';
    cityarea[238] = '山上區';
    cityarea[239] = '新市區';
    cityarea[240] = '安定區';
    cityarea_account[14] = 240;
    cityarea[241] = '新興區';
    cityarea[242] = '前金區';
    cityarea[243] = '苓雅區';
    cityarea[244] = '鹽埕區';
    cityarea[245] = '鼓山區';
    cityarea[246] = '旗津區';
    cityarea[247] = '前鎮區';
    cityarea[248] = '三民區';
    cityarea[249] = '楠梓區';
    cityarea[250] = '小港區';
    cityarea[251] = '左營區';
    cityarea[252] = '仁武區';
    cityarea[253] = '大社區';
    cityarea[254] = '東沙群島';
    cityarea[255] = '南沙群島';
    cityarea[256] = '岡山區';
    cityarea[257] = '路竹區';
    cityarea[258] = '阿蓮區';
    cityarea[259] = '田寮區';
    cityarea[260] = '燕巢區';
    cityarea[261] = '橋頭區';
    cityarea[262] = '梓官區';
    cityarea[263] = '彌陀區';
    cityarea[264] = '永安區';
    cityarea[265] = '湖內區';
    cityarea[266] = '鳳山區';
    cityarea[267] = '大寮區';
    cityarea[268] = '林園區';
    cityarea[269] = '鳥松區';
    cityarea[270] = '大樹區';
    cityarea[271] = '旗山區';
    cityarea[272] = '美濃區';
    cityarea[273] = '六龜區';
    cityarea[274] = '內門區';
    cityarea[275] = '杉林區';
    cityarea[276] = '甲仙區';
    cityarea[277] = '桃源區';
    cityarea[278] = '那瑪夏區';
    cityarea[279] = '茂林區';
    cityarea[280] = '茄萣區';
    cityarea_account[15] = 280;
    cityarea[281] = '屏東市';
    cityarea[282] = '三地門鄉';
    cityarea[283] = '霧台鄉';
    cityarea[284] = '瑪家鄉';
    cityarea[285] = '九如鄉';
    cityarea[286] = '里港鄉';
    cityarea[287] = '高樹鄉';
    cityarea[288] = '鹽埔鄉';
    cityarea[289] = '長治鄉';
    cityarea[290] = '麟洛鄉';
    cityarea[291] = '竹田鄉';
    cityarea[292] = '內埔鄉';
    cityarea[293] = '萬丹鄉';
    cityarea[294] = '潮州鎮';
    cityarea[295] = '泰武鄉';
    cityarea[296] = '來義鄉';
    cityarea[297] = '萬巒鄉';
    cityarea[298] = '崁頂鄉';
    cityarea[299] = '新埤鄉';
    cityarea[300] = '南州鄉';
    cityarea[301] = '林邊鄉';
    cityarea[302] = '東港鎮';
    cityarea[303] = '琉球鄉';
    cityarea[304] = '佳冬鄉';
    cityarea[305] = '新園鄉';
    cityarea[306] = '枋寮鄉';
    cityarea[307] = '枋山鄉';
    cityarea[308] = '春日鄉';
    cityarea[309] = '獅子鄉';
    cityarea[310] = '車城鄉';
    cityarea[311] = '牡丹鄉';
    cityarea[312] = '恆春鎮';
    cityarea[313] = '滿州鄉';
    cityarea_account[16] = 313;
    cityarea[314] = '台東市';
    cityarea[315] = '綠島鄉';
    cityarea[316] = '蘭嶼鄉';
    cityarea[317] = '延平鄉';
    cityarea[318] = '卑南鄉';
    cityarea[319] = '鹿野鄉';
    cityarea[320] = '關山鎮';
    cityarea[321] = '海端鄉';
    cityarea[322] = '池上鄉';
    cityarea[323] = '東河鄉';
    cityarea[324] = '成功鎮';
    cityarea[325] = '長濱鄉';
    cityarea[326] = '太麻里鄉';
    cityarea[327] = '金峰鄉';
    cityarea[328] = '大武鄉';
    cityarea[329] = '達仁鄉';
    cityarea_account[17] = 329;
    cityarea[330] = '花蓮市';
    cityarea[331] = '新城鄉';
    cityarea[332] = '秀林鄉';
    cityarea[333] = '吉安鄉';
    cityarea[334] = '壽豐鄉';
    cityarea[335] = '鳳林鎮';
    cityarea[336] = '光復鄉';
    cityarea[337] = '豐濱鄉';
    cityarea[338] = '瑞穗鄉';
    cityarea[339] = '萬榮鄉';
    cityarea[340] = '玉里鎮';
    cityarea[341] = '卓溪鄉';
    cityarea[342] = '富里鄉';
    cityarea_account[18] = 342;
    cityarea[343] = '宜蘭市';
    cityarea[344] = '頭城鎮';
    cityarea[345] = '礁溪鄉';
    cityarea[346] = '壯圍鄉';
    cityarea[347] = '員山鄉';
    cityarea[348] = '羅東鎮';
    cityarea[349] = '三星鄉';
    cityarea[350] = '大同鄉';
    cityarea[351] = '五結鄉';
    cityarea[352] = '冬山鄉';
    cityarea[353] = '蘇澳鎮';
    cityarea[354] = '南澳鄉';
    cityarea[355] = '釣魚台';
    cityarea_account[19] = 355;
    cityarea[356] = '馬公市';
    cityarea[357] = '西嶼鄉';
    cityarea[358] = '望安鄉';
    cityarea[359] = '七美鄉';
    cityarea[360] = '白沙鄉';
    cityarea[361] = '湖西鄉';
    cityarea_account[20] = 361;
    cityarea[362] = '金沙鎮';
    cityarea[363] = '金湖鎮';
    cityarea[364] = '金寧鄉';
    cityarea[365] = '金城鎮';
    cityarea[366] = '烈嶼鄉';
    cityarea[367] = '烏坵鄉';
    cityarea_account[21] = 367;
    cityarea[368] = '南竿鄉';
    cityarea[369] = '北竿鄉';
    cityarea[370] = '莒光鄉';
    cityarea[371] = '東引鄉';
    cityarea_account[22] = 371;
    cityarea[372] = '東沙群島';
    cityarea[373] = '南沙群島';
    cityarea_account[23] = 373;
    cityarea[374] = '釣魚台';
    city_account = 23;
}

說明: 如果要移動宜蘭的位置, 要修改掉的行數多到... 我都累了,


我的解法,

step 1: 透過 Notepad++ 的 RegExp 取代,
目前的資料為:
cityarea[374] = '釣魚台';
你希望要變成:
cityarea.push('釣魚台');

請使用 [SearchPattern]:
cityarea\[([0-9]+)\] = '(.+)'
並輸入 [ReplacePattern]:
cityarea.push\('\2'\)

替換,陣列絕對坐標為相對坐標後的程式碼:
function initialCityOptionTW(){
    cityarea_account.push(0);
    cityarea.push('');
    cityarea.push('仁愛區');
    cityarea.push('信義區');
    cityarea.push('中正區');
    cityarea.push('中山區');
    cityarea.push('安樂區');
    cityarea.push('暖暖區');
    cityarea.push('七堵區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('中正區');
    cityarea.push('大同區');
    cityarea.push('中山區');
    cityarea.push('松山區');
    cityarea.push('大安區');
    cityarea.push('萬華區');
    cityarea.push('信義區');
    cityarea.push('士林區');
    cityarea.push('北投區');
    cityarea.push('內湖區');
    cityarea.push('南港區');
    cityarea.push('文山區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('萬里區');
    cityarea.push('金山區');
    cityarea.push('板橋區');
    cityarea.push('汐止區');
    cityarea.push('深坑區');
    cityarea.push('石碇區');
    cityarea.push('瑞芳區');
    cityarea.push('平溪區');
    cityarea.push('雙溪區');
    cityarea.push('貢寮區');
    cityarea.push('新店區');
    cityarea.push('坪林區');
    cityarea.push('烏來區');
    cityarea.push('永和區');
    cityarea.push('中和區');
    cityarea.push('土城區');
    cityarea.push('三峽區');
    cityarea.push('樹林區');
    cityarea.push('鶯歌區');
    cityarea.push('三重區');
    cityarea.push('新莊區');
    cityarea.push('泰山區');
    cityarea.push('林口區');
    cityarea.push('蘆洲區');
    cityarea.push('五股區');
    cityarea.push('八里區');
    cityarea.push('淡水區');
    cityarea.push('三芝區');
    cityarea.push('石門區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('中壢市');
    cityarea.push('平鎮市');
    cityarea.push('龍潭鄉');
    cityarea.push('楊梅市');
    cityarea.push('新屋鄉');
    cityarea.push('觀音鄉');
    cityarea.push('桃園市');
    cityarea.push('龜山鄉');
    cityarea.push('八德市');
    cityarea.push('大溪鎮');
    cityarea.push('復興鄉');
    cityarea.push('大園鄉');
    cityarea.push('蘆竹鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('東區');
    cityarea.push('北區');
    cityarea.push('香山區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('竹北市');
    cityarea.push('湖口鄉');
    cityarea.push('新豐鄉');
    cityarea.push('新埔鎮');
    cityarea.push('關西鎮');
    cityarea.push('芎林鄉');
    cityarea.push('寶山鄉');
    cityarea.push('竹東鎮');
    cityarea.push('五峰鄉');
    cityarea.push('橫山鄉');
    cityarea.push('尖石鄉');
    cityarea.push('北埔鄉');
    cityarea.push('峨眉鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('竹南鎮');
    cityarea.push('頭份鎮');
    cityarea.push('三灣鄉');
    cityarea.push('南庄鄉');
    cityarea.push('獅潭鄉');
    cityarea.push('後龍鎮');
    cityarea.push('通霄鎮');
    cityarea.push('苑裡鎮');
    cityarea.push('苗栗市');
    cityarea.push('造橋鄉');
    cityarea.push('頭屋鄉');
    cityarea.push('公館鄉');
    cityarea.push('大湖鄉');
    cityarea.push('泰安鄉');
    cityarea.push('銅鑼鄉');
    cityarea.push('三義鄉');
    cityarea.push('西湖鄉');
    cityarea.push('卓蘭鎮');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('中區');
    cityarea.push('東區');
    cityarea.push('南區');
    cityarea.push('西區');
    cityarea.push('北區');
    cityarea.push('北屯區');
    cityarea.push('西屯區');
    cityarea.push('南屯區');
    cityarea.push('太平區');
    cityarea.push('大里區');
    cityarea.push('霧峰區');
    cityarea.push('烏日區');
    cityarea.push('豐原區');
    cityarea.push('后里區');
    cityarea.push('石岡區');
    cityarea.push('東勢區');
    cityarea.push('和平區');
    cityarea.push('新社區');
    cityarea.push('潭子區');
    cityarea.push('大雅區');
    cityarea.push('神岡區');
    cityarea.push('大肚區');
    cityarea.push('沙鹿區');
    cityarea.push('龍井區');
    cityarea.push('梧棲區');
    cityarea.push('清水區');
    cityarea.push('大甲區');
    cityarea.push('外埔區');
    cityarea.push('大安區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('彰化市');
    cityarea.push('芬園鄉');
    cityarea.push('花壇鄉');
    cityarea.push('秀水鄉');
    cityarea.push('鹿港鎮');
    cityarea.push('福興鄉');
    cityarea.push('線西鄉');
    cityarea.push('和美鎮');
    cityarea.push('伸港鄉');
    cityarea.push('員林鎮');
    cityarea.push('社頭鄉');
    cityarea.push('永靖鄉');
    cityarea.push('埔心鄉');
    cityarea.push('溪湖鎮');
    cityarea.push('大村鄉');
    cityarea.push('埔鹽鄉');
    cityarea.push('田中鎮');
    cityarea.push('北斗鎮');
    cityarea.push('田尾鄉');
    cityarea.push('埤頭鄉');
    cityarea.push('溪州鄉');
    cityarea.push('竹塘鄉');
    cityarea.push('二林鎮');
    cityarea.push('大城鄉');
    cityarea.push('芳苑鄉');
    cityarea.push('二水鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('南投市');
    cityarea.push('中寮鄉');
    cityarea.push('草屯鎮');
    cityarea.push('國姓鄉');
    cityarea.push('埔里鎮');
    cityarea.push('仁愛鄉');
    cityarea.push('名間鄉');
    cityarea.push('集集鎮');
    cityarea.push('水里鄉');
    cityarea.push('魚池鄉');
    cityarea.push('信義鄉');
    cityarea.push('竹山鎮');
    cityarea.push('鹿谷鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('斗南鎮');
    cityarea.push('大埤鄉');
    cityarea.push('虎尾鎮');
    cityarea.push('土庫鎮');
    cityarea.push('褒忠鄉');
    cityarea.push('東勢鄉');
    cityarea.push('台西鄉');
    cityarea.push('崙背鄉');
    cityarea.push('麥寮鄉');
    cityarea.push('斗六市');
    cityarea.push('林內鄉');
    cityarea.push('古坑鄉');
    cityarea.push('莿桐鄉');
    cityarea.push('西螺鎮');
    cityarea.push('二崙鄉');
    cityarea.push('北港鎮');
    cityarea.push('水林鄉');
    cityarea.push('口湖鄉');
    cityarea.push('四湖鄉');
    cityarea.push('元長鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('東區');
    cityarea.push('西區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('番路鄉');
    cityarea.push('梅山鄉');
    cityarea.push('竹崎鄉');
    cityarea.push('阿里山鄉');
    cityarea.push('中埔鄉');
    cityarea.push('大埔鄉');
    cityarea.push('水上鄉');
    cityarea.push('鹿草鄉');
    cityarea.push('太保市');
    cityarea.push('朴子市');
    cityarea.push('東石鄉');
    cityarea.push('六腳鄉');
    cityarea.push('新港鄉');
    cityarea.push('民雄鄉');
    cityarea.push('大林鎮');
    cityarea.push('溪口鄉');
    cityarea.push('義竹鄉');
    cityarea.push('布袋鎮');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('中西區');
    cityarea.push('東區');
    cityarea.push('南區');
    cityarea.push('北區');
    cityarea.push('安平區');
    cityarea.push('安南區');
    cityarea.push('永康區');
    cityarea.push('歸仁區');
    cityarea.push('新化區');
    cityarea.push('左鎮區');
    cityarea.push('玉井區');
    cityarea.push('楠西區');
    cityarea.push('南化區');
    cityarea.push('仁德區');
    cityarea.push('關廟區');
    cityarea.push('龍崎區');
    cityarea.push('官田區');
    cityarea.push('麻豆區');
    cityarea.push('佳里區');
    cityarea.push('西港區');
    cityarea.push('七股區');
    cityarea.push('將軍區');
    cityarea.push('學甲區');
    cityarea.push('北門區');
    cityarea.push('新營區');
    cityarea.push('後壁區');
    cityarea.push('白河區');
    cityarea.push('東山區');
    cityarea.push('六甲區');
    cityarea.push('下營區');
    cityarea.push('柳營區');
    cityarea.push('鹽水區');
    cityarea.push('善化區');
    cityarea.push('大內區');
    cityarea.push('山上區');
    cityarea.push('新市區');
    cityarea.push('安定區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('新興區');
    cityarea.push('前金區');
    cityarea.push('苓雅區');
    cityarea.push('鹽埕區');
    cityarea.push('鼓山區');
    cityarea.push('旗津區');
    cityarea.push('前鎮區');
    cityarea.push('三民區');
    cityarea.push('楠梓區');
    cityarea.push('小港區');
    cityarea.push('左營區');
    cityarea.push('仁武區');
    cityarea.push('大社區');
    cityarea.push('東沙群島');
    cityarea.push('南沙群島');
    cityarea.push('岡山區');
    cityarea.push('路竹區');
    cityarea.push('阿蓮區');
    cityarea.push('田寮區');
    cityarea.push('燕巢區');
    cityarea.push('橋頭區');
    cityarea.push('梓官區');
    cityarea.push('彌陀區');
    cityarea.push('永安區');
    cityarea.push('湖內區');
    cityarea.push('鳳山區');
    cityarea.push('大寮區');
    cityarea.push('林園區');
    cityarea.push('鳥松區');
    cityarea.push('大樹區');
    cityarea.push('旗山區');
    cityarea.push('美濃區');
    cityarea.push('六龜區');
    cityarea.push('內門區');
    cityarea.push('杉林區');
    cityarea.push('甲仙區');
    cityarea.push('桃源區');
    cityarea.push('那瑪夏區');
    cityarea.push('茂林區');
    cityarea.push('茄萣區');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('屏東市');
    cityarea.push('三地門鄉');
    cityarea.push('霧台鄉');
    cityarea.push('瑪家鄉');
    cityarea.push('九如鄉');
    cityarea.push('里港鄉');
    cityarea.push('高樹鄉');
    cityarea.push('鹽埔鄉');
    cityarea.push('長治鄉');
    cityarea.push('麟洛鄉');
    cityarea.push('竹田鄉');
    cityarea.push('內埔鄉');
    cityarea.push('萬丹鄉');
    cityarea.push('潮州鎮');
    cityarea.push('泰武鄉');
    cityarea.push('來義鄉');
    cityarea.push('萬巒鄉');
    cityarea.push('崁頂鄉');
    cityarea.push('新埤鄉');
    cityarea.push('南州鄉');
    cityarea.push('林邊鄉');
    cityarea.push('東港鎮');
    cityarea.push('琉球鄉');
    cityarea.push('佳冬鄉');
    cityarea.push('新園鄉');
    cityarea.push('枋寮鄉');
    cityarea.push('枋山鄉');
    cityarea.push('春日鄉');
    cityarea.push('獅子鄉');
    cityarea.push('車城鄉');
    cityarea.push('牡丹鄉');
    cityarea.push('恆春鎮');
    cityarea.push('滿州鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('台東市');
    cityarea.push('綠島鄉');
    cityarea.push('蘭嶼鄉');
    cityarea.push('延平鄉');
    cityarea.push('卑南鄉');
    cityarea.push('鹿野鄉');
    cityarea.push('關山鎮');
    cityarea.push('海端鄉');
    cityarea.push('池上鄉');
    cityarea.push('東河鄉');
    cityarea.push('成功鎮');
    cityarea.push('長濱鄉');
    cityarea.push('太麻里鄉');
    cityarea.push('金峰鄉');
    cityarea.push('大武鄉');
    cityarea.push('達仁鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('花蓮市');
    cityarea.push('新城鄉');
    cityarea.push('秀林鄉');
    cityarea.push('吉安鄉');
    cityarea.push('壽豐鄉');
    cityarea.push('鳳林鎮');
    cityarea.push('光復鄉');
    cityarea.push('豐濱鄉');
    cityarea.push('瑞穗鄉');
    cityarea.push('萬榮鄉');
    cityarea.push('玉里鎮');
    cityarea.push('卓溪鄉');
    cityarea.push('富里鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('宜蘭市');
    cityarea.push('頭城鎮');
    cityarea.push('礁溪鄉');
    cityarea.push('壯圍鄉');
    cityarea.push('員山鄉');
    cityarea.push('羅東鎮');
    cityarea.push('三星鄉');
    cityarea.push('大同鄉');
    cityarea.push('五結鄉');
    cityarea.push('冬山鄉');
    cityarea.push('蘇澳鎮');
    cityarea.push('南澳鄉');
    cityarea.push('釣魚台');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('馬公市');
    cityarea.push('西嶼鄉');
    cityarea.push('望安鄉');
    cityarea.push('七美鄉');
    cityarea.push('白沙鄉');
    cityarea.push('湖西鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('金沙鎮');
    cityarea.push('金湖鎮');
    cityarea.push('金寧鄉');
    cityarea.push('金城鎮');
    cityarea.push('烈嶼鄉');
    cityarea.push('烏坵鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('南竿鄉');
    cityarea.push('北竿鄉');
    cityarea.push('莒光鄉');
    cityarea.push('東引鄉');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('東沙群島');
    cityarea.push('南沙群島');
    cityarea_account.push(cityarea.length-2);
    cityarea.push('釣魚台');
}

這個時候, 要怎麼移動聯動裡Option 的值就很方便, 整個區塊移走就ok了.



相關文章:



2012年9月12日 星期三

SQL Server 斷詞後, 同義詞的問題

SQL Server 斷詞查不到資料, 有2個解決方法:

  • 方案1: 使用 舊版的斷詞DLL (CHTBRKR.DLL)
  • 方案2: 使用詞庫來解決: tcainlex.txt


如果使用了方案1之後, 就會造成同義詞功能無法使用(tsCHT.XML)
目前暫時無解, 用最兩光的自己動手寫來解決:
dim checkKeywordExpansion
checkKeywordExpansion = ap_THESAURUS_expansion(myKeywordItem)

if myFieldName = "*" then
    '// 查多個欄位, 全查.
    searchFields = "*"
    if checkKeywordExpansion = "" then
        '// 一般查詢
        myKeywordSQL = myKeywordSQL & dbQueryMethod &"("& searchFields &" ,N'" & myKeywordItem & "')"
    else
        '// expansion
        myKeywordSQL = myKeywordSQL & "("
        myKeywordSQL = myKeywordSQL & dbQueryMethod &"("& searchFields &" ,N'" & myKeywordItem & "')"
        myKeywordSQL = myKeywordSQL & " OR " & dbQueryMethod &"("& searchFields &" ,N'" & checkKeywordExpansion & "')"
        myKeywordSQL = myKeywordSQL & ")"
    end if
else
    '// 只查某個欄位.
    searchFields = myFieldName
    
    if checkKeywordExpansion = "" then
        '// 一般查詢
        myKeywordSQL = myKeywordSQL & dbQueryMethod &"("& searchFields &" ,N'" & myKeywordItem & "')"
    else
        '// expansion
        myKeywordSQL = myKeywordSQL & "("
        myKeywordSQL = myKeywordSQL & dbQueryMethod &"("& searchFields &" ,N'" & myKeywordItem & "')"
        myKeywordSQL = myKeywordSQL & " OR " & dbQueryMethod &"("& searchFields &" ,N'" & checkKeywordExpansion & "')"
        myKeywordSQL = myKeywordSQL & ")"
    end if
end if


'// purpose: 是否符合 THESAURUS_expansion rule.
'// return: 傳回 keyword expansion 後結果.
'// ps: 這個不是 "最佳解法", 只是為了立刻解掉這個問題.
'// 由於換掉斷詞工具. 無法使用 THESAURUS
function ap_THESAURUS_expansion(byval keywordItem)
    dim returnValue
    returnValue = ""
    
    dim isMatchExpansion
    isMatchExpansion = not True
    
    dim currentPat
    currentPat = ""
    
    if not isMatchExpansion then
        currentPat = "台"
        currentSub = "臺"
        if instr(keywordItem, currentPat) > 0 then
            isMatchExpansion = true
            returnValue = replace(keywordItem, currentPat, currentSub)
        end if
    end if
    
    if not isMatchExpansion then
        currentPat = "臺"
        currentSub = "台"
        if instr(keywordItem, currentPat) > 0 then
            isMatchExpansion = true
            returnValue = replace(keywordItem, currentPat, currentSub)
        end if
    end if

    ap_THESAURUS_expansion = returnValue
end function




相關文章:
[SQL]使用SQL2005全文檢索功能
http://www.dotblogs.com.tw/dotjum/archive/2009/08/01/9796.aspx

SQL Server 2005/2008 斷字詞 DLL
http://byronhu.wordpress.com/2009/03/13/sql-server-20052008-%E6%96%B7%E5%AD%97%E8%A9%9E-dll/

2012年9月11日 星期二

多個景點(坐標), 套google map 的方法

資料來源:
http://stackoverflow.com/questions/3059044/google-maps-js-api-v3-simple-multiple-marker-example


多個坐標, 就要透過 google map API 來呼叫, 才能使用, 用法也很簡單, html 範例如下:
<script src="http://maps.google.com/maps/api/js?sensor=false&language=zh_TW" type="text/javascript"></script>
<div id="map" style="width: 500px; height: 400px;"></div>
<script type="text/javascript">
var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

var map = new google.maps.Map(document.getElementById('map'), {
  zoom: 10,
  center: new google.maps.LatLng(-33.92, 151.25),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

var infowindow = new google.maps.InfoWindow();

var marker, i;
for (i = 0; i < locations.length; i++) {  
  marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    title: locations[i][0],
    zIndex: locations[i][3],
    map: map
  });
  google.maps.event.addListener(marker, 'click', (function(marker, i) {
    return function() {
      infowindow.setContent(locations[i][0]);
      infowindow.open(map, marker);
    }
  })(marker, i));
}
</script>

套出來的畫面如下:


說明1: 原來的範例裡的 marker, 沒有加 title, 所以滑鼠移過去時(onMouseOver) 不會顯示出 坐標的名稱(Title), 上面的code 裡, 已經有加 title 進去 market 裡.

說明2: sensor=false&language=zh_TW, 代表要使用繁體中文介面, 沒加的話browser 會挑戰去偵測目前使用的語系, 有可能會猜錯.


如果想要換 marker 的 icon image 的話, 可以試試看下面的範例:
<div id="map_canvas" style="width: 500px; height: 400px;"></div>
<script type="text/javascript">
var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(-33.9, 151.2),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  setMarkers(map, beaches);
}

function setMarkers(map, locations) {
  var image = new google.maps.MarkerImage('images/beachflag.png',
      new google.maps.Size(20, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
  var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',
      new google.maps.Size(37, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
  var shape = {
      coord: [1, 1, 1, 20, 18, 20, 18 , 1],
      type: 'poly'
  };
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
        position: myLatLng,
        map: map,
        shadow: shadow,
        icon: image,
        shape: shape,
        title: beach[0],
        zIndex: beach[3]
    });
  }
}

initialize();
</script>



最後完成的asp sample code 如下:
'// google map API.
Response.Write("<script src=""http://maps.google.com/maps/api/js?sensor=false&language=zh_TW"" type=""text/javascript""></script>"&vbCrLf)

Response.Write("<script type=""text/javascript"">"&vbCrLf)
Response.Write("function initialize_map(map_id, locations) {"&vbCrLf)
Response.Write("    var map = new google.maps.Map(document.getElementById(map_id), {"&vbCrLf)
Response.Write("      zoom: 10,"&vbCrLf)
Response.Write("      center: new google.maps.LatLng(locations[0][1], locations[0][2]),"&vbCrLf)
Response.Write("      mapTypeId: google.maps.MapTypeId.ROADMAP"&vbCrLf)
Response.Write("    });"&vbCrLf)
Response.Write("    var infowindow = new google.maps.InfoWindow();"&vbCrLf)
Response.Write("    var marker, i;"&vbCrLf)
Response.Write("    for (i = 0; i < locations.length; i++) {  "&vbCrLf)
Response.Write("      marker = new google.maps.Marker({"&vbCrLf)
Response.Write("        position: new google.maps.LatLng(locations[i][1], locations[i][2]),"&vbCrLf)
Response.Write("        title: locations[i][0],"&vbCrLf)
Response.Write("        zIndex: locations[i][3],"&vbCrLf)
Response.Write("        map: map"&vbCrLf)
Response.Write("      });"&vbCrLf)
Response.Write("      "&vbCrLf)
Response.Write("      google.maps.event.addListener(marker, 'click', (function(marker, i) {"&vbCrLf)
Response.Write("        return function() {"&vbCrLf)
Response.Write("          infowindow.setContent(locations[i][0]);"&vbCrLf)
Response.Write("          infowindow.open(map, marker);"&vbCrLf)
Response.Write("        }"&vbCrLf)
Response.Write("      })(marker, i));"&vbCrLf)
Response.Write("    }"&vbCrLf)
Response.Write("}"&vbCrLf)
Response.Write("</script>"&vbCrLf)

dim Index
Index = 0
do
    Index = Index + 1
    
    Set RsDetail = Server.CreateObject("ADODB.RecordSet")
    RsDetail.open SqlDetail, conn, 1, 1

    Response.Write "<h4>" & trim("" & myRS("Title")) & "</h4>" & vbCrLf
    if not RsDetail.eof then
        Response.Write "<div class='map'>"
        Response.Write("<h4>【"& server.htmlencode(trim("" & myRS("Subject"))) &"】</h4>"&vbCrLf)
        Response.Write "<div id='map_canvas_"& Index &"' style='width: 600px; height: 400px;'></div>"
        Response.Write "</div>"&vbCrLf
        
        Response.Write("<script type=""text/javascript"">"&vbCrLf)
        Response.Write("var locations_"& Index &" = ["&vbCrLf)
        
        dim detailIndex
        detailIndex = 0
        do
            detailIndex = detailIndex + 1
            
            dim DetailLongitude
            dim DetailLatitude
            dim DetailName
            DetailName = trim("" & rsDetail("DetailName"))
            DetailLongitude = trim("" & rsDetail("DetailLongitude"))
            DetailLatitude = trim("" & rsDetail("DetailLatitude"))
            
            Response.Write "['"& DetailName &"', "& DetailLatitude &", "& DetailLongitude &", "& detailIndex &"]"

            RsDetail.movenext
            if RsDetail.eof then
                exit do
            end if
            Response.Write ","
        loop
        Response.Write("];"&vbCrLf)
        
        '// delay 1 second to show each google map.
        Response.Write("setTimeout(""initialize_map('map_canvas_"& Index &"', locations_"& Index &");"", "& (clng(Index) * 1000)+3000 &");"&vbCrLf)
        Response.Write("</script>"&vbCrLf)
        RsDetail.movefirst
    end if
    myRS.movenext
    if myRS.eof then
        exit do
    end if
loop




單一景點(坐標), 套google map 的方法



單一景點(坐標), 套google map 的方法,
這個方法很簡單, 直接用 iframe 把 google map 叫進來就做完了,
相關的 asp code 如下:
dim iframe_google_map_url
iframe_google_map_url = ""
if DetailLatitude <> "" then
    iframe_google_map_url = "http://maps.google.com.tw/maps?ie=UTF8&f=q&hl=zh-TW&geocode=&z=14&output=embed&t="
    'iframe_google_map_url = iframe_google_map_url & "&ll=" & DetailLatitude &","& DetailLongitude
    iframe_google_map_url = iframe_google_map_url & "&q="& DetailLatitude &","& DetailLongitude &"(" & server.urlencode(DetailName) & ")"
end if

if iframe_google_map_url <> "" then
    Response.Write "<div class='map'>"
    Response.Write "<iframe width='425' height='350' frameborder='0' scrolling='no' marginheight='0' marginwidth='0'"
    Response.Write " src='" & iframe_google_map_url & "'></iframe>"
    Response.Write "<br /><small><a href='"& iframe_google_map_url &"' target='_google_map' style='color:#0000FF;text-align:left'>檢視較大的地圖</a></small>"
    Response.Write "</div>"&vbCrLf
end if

相關文章: google keyword: iframe google map

2012年9月10日 星期一

比對次數大約從 N平方降低到 N

假設, 有2個陣列的資料內容要做比對,
陣列1的資料 {1,2,3,4,5,6,7,8,9,10}
陣列2的資料 {6,7,8,9,10}

一般的資料比對的程式如下:
for(var iDataFind=0; iDataFind<array_find.length; iDataFind++){
    var j = 0;
    while (j < originalArray.length) {
        if (originalArray[j] == itemToRemove) {
            //...
            break;
        } else { j++; }
    }
}
陣列2的資料6, 總共比對 6次,
陣列2的資料7, 總共比對 7次,
陣列2的資料8, 總共比對 8次,
陣列2的資料9, 總共比對 9次,
陣列2的資料10, 總共比對 10次,

假設陣列1 + 陣列2都是 "已排序" 過的資料, 所以不需要從頭做比對, 程式如下:
var last_jPos=0;
for(var iPos=0; iPos < listSelectedArray.length; iPos++){
    var itemToDetect=listSelectedArray[iPos];
    var jPos = 0;
    if(final_array.length > 0 ){
        for(var jPos=last_jPos; jPos < final_array.length; jPos++){
            if (final_array[jPos] == itemToDetect) {
                final_array[jPos] = [final_array[jPos], 'X'].join("");
                last_jPos=jPos+1;
                break;
            }
        }
    }
}
陣列2的資料6, 總共比對 6次,
陣列2的資料7, 總共比對 1次,
陣列2的資料8, 總共比對 1次,
陣列2的資料9, 總共比對 1次,
陣列2的資料10, 總共比對 1次,
結論, 比對次數大約從 N平方降低到 N.



一般的陣列互相移除, 程式:
function array_remove_from_array(array_all, array_find){
    if(array_find.length>0){
        for(var iDataFind=0; iDataFind<array_find.length; iDataFind++){
            arrayRemove(array_all, array_find[iDataFind]);
        }
    }
}
function arrayRemove(originalArray, itemToRemove) {
    var j = 0;
    while (j < originalArray.length) {
        if (originalArray[j] == itemToRemove) {
            originalArray.splice(j, 1);
            // remove first.
            break;
        } else { j++; }
    }
}
說明: 這個可能會跑到 N平方次.


已排序過的資料, 請使用這一個副程式:
function array_remove_from_array_sorted(array_all, array_find){
    if(array_find.length>0){
        var last_jPos=0;
        for(var iDataFind=0; iDataFind<array_find.length; iDataFind++){
            var itemToDetect=array_find[iDataFind];
            for(var jPos=last_jPos; jPos < array_all.length; jPos++){
                if (array_all[jPos] == itemToDetect) {
                    last_jPos=jPos;
                    array_all.splice(jPos, 1);
                    break;
                }
            }
        }
    }
}
說明: 使用 last_jPos=jPos; 是因為 item 被移除了, 下一個 item 在比對時, 要從被移掉的位置來比對, 以上面的例子說來, 當6移掉後, 後面的 7 會移到 6的位置, 他的 index 是被移掉的位置.


我的個案是 陣列1筆數1萬筆, 陣列2筆數 5000筆, 假設你的電腦效能很好, 每1秒可以比對50萬次, 以舊方法比對需要 100秒, 改用新方法, 只需要比對1萬次, 0.02秒.

新增 option 到 select box 裡的2個方法

新增 option 到 select box 裡的2個方法,

方法1: 用 element (object) 方式.
function appendToSelect(select, value, content) {
    var opt;
    opt = document.createElement("option");
    opt.value = value;
    var theData = document.createTextNode(content);
    opt.appendChild(theData);
    select.appendChild(opt);
}

方法2: 用 string (html) 方式.
var select_option_html='';
if(final_array.length>0){
    for(var iFinal=0; iFinal<final_array.length; iFinal++){
        var array_selected_flag='';
        if(final_array[iFinal].indexOf('X')!=-1){
            array_selected_flag=' selected';
            final_array[iFinal] = final_array[iFinal].substring(0,final_array[iFinal].length-1);;
        }
        select_option_html+=['<option value="', final_array[iFinal].toString(), '"', array_selected_flag, '>', final_array[iFinal].toString(), '</option>'].join("");
    }
    $("#countries").html(select_option_html);
}

實際測試, 當資料量在 1萬筆左右, 用新版的 chrome(或 firefox) 來測其實差異不大, 理論上 string(html) 效能上比較快, 有人說方法1(element) 大約在 0.4秒, 方法2(string) 大約在 0.7秒, 其實差 0.3秒應該是無感, 理論上應該是 string(html) 比較優, 當在處理 "大量" 資料時.

2012年9月7日 星期五

dreamweaver cs4 在onLoad運行RecordsetFind.htm時出錯 解決方法


同事的Dreamweaver 壞掉, 出現錯誤後又嘗試重新裝, 仍然出現下面的錯誤:
在onLoad運行RecordsetFind.htm時,發生了以下JavaScript錯誤:
在文件"RecordsetFind": ReferenceError:findRs is not defined

WinXP 的話, 請刪除
C:\Documents and Settings\Administrator\Application Data\adobe\
這個文件夾,重新打開dw, 就ok了.

Win7 的話, 請刪除:
C:\Users\dreamlx\AppData\Roaming\Adobe\
這個資料夾, 

2012年9月6日 星期四

jquery-ui-multiselect-widget 遇到資料量大於 2000筆的 option

jquery-ui-multiselect-widget 遇到資料量大於 2000筆的 option會有效能上的問題, 舊電腦可能需要到4分鐘, 才能產生出畫面, 相關討論如下:
https://github.com/ehynds/jquery-ui-multiselect-widget/issues/157

Hello, I experienced performance problems when more than 2000 options. To took an average of four minutes to assemble the combo (bad machines), not to mention when you click on or search.


我還在研究看看, 怎麼解決這個問題.

javascript 副程式分享 rangeText 與 array 互轉

首先要定義 rangeText 是什麼, 例如:
1,2,8-10

首先透過 副程式1號, 把 rangeText 放到 array 裡:
rangeText_to_array(list_string)
function rangeText_to_array(list_string){
    var return_array = new Array();
    if(list_string!="")
    {
        var listDataArray= new Array();
        listDataArray=list_string.split(",");
        for (var iPos=0; iPos<listDataArray.length; iPos++ )
        {
            var currentItem;
            currentItem=trim(listDataArray[iPos]);
            if(currentItem.indexOf("-")==-1){
                return_array.push(currentItem);
            }
            else
            {
                // range
                var range_begin=trim(leftField(currentItem,"-"));
                var range_end=trim(rightField(currentItem,"-"));
                for(var rangeIndex=parseInt(range_begin,10); rangeIndex<=parseInt(range_end,10); rangeIndex++)
                {
                    return_array.push(rangeIndex);
                }
            }
        }
    }
    return_array.sort();
    return return_array;
}


如果, 要把 array 裡的值轉成 rangeText:
function array_to_rangeText(E) {
    var val = "";
    if (E.length) {
        var last_value='';
        var is_queue_status=false;
        for (var iPos = 0; iPos < E.length; iPos++) {
            var my_value=E[iPos];
            if(last_value!="" && my_value!=""){
                if(isNextNumber(last_value,my_value)){
                    is_queue_status=true;
                }
                else
                {
                    if(is_queue_status){
                        if(val != "") val += "-";
                        val += last_value;
                    }
                    is_queue_status=false;
                }
            }
            if(!is_queue_status){
                if(val != "") val += ",";
                val += E[iPos];
            }
            // 記住上一個號碼.
            last_value = E[iPos];
        }
        if(is_queue_status){
            if(val != "") val += "-";
            val += last_value;
        }
    }
    return val;
}

// 判斷號碼是否連續.
function isNextNumber(num1, num2){
    var returnValue = false;
    if(isNumeric(num1) && isNumeric(num2)){
        if(parseInt(num2,10)-parseInt(num1,10)==1){
            returnValue = true;
        }
    }
    return returnValue;
}

//檢查是否為數字
function isNumeric(num) {
    if(isNaN(num)){
        return false;
    }
    return true;
}

為什麼要這樣子轉來轉去? 因為要把使用者看的數字(ex: 8-12) 做部份的刪除, 刪完後, 再要種新格式化成 rangeText 給使者用看.

還會需要用到2個 array function:
1. find item in array
function arrayFind(originalArray, itemToDetect) {
    var j = 0;
    while (j < originalArray.length) {
        if (originalArray[j] == itemToDetect) {
            return true;
        } else { j++; }
    }
    return false;
}

2. remove item (string or number) from an array
function arrayRemove(originalArray, itemToRemove) {
    var j = 0;
    while (j < originalArray.length) {
        if (originalArray[j] == itemToRemove) {
            originalArray.splice(j, 1);
            // remove first.
            break;
        } else { j++; }
    }
}
說明: 這裡會有, value 在 array 會不會重覆的問題, 假設不會重覆的情況下, 就只需要 remove first 即可.

array 的 append, 用 array.push 就完成了.

array 相減, 左邊是全部item, 右邊是要刪掉的item.
function array_remove_from_array(array_all, array_find){
    if(array_find.length>0){
        for(var iDataFind=0; iDataFind<array_find.length; iDataFind++){
            arrayRemove(array_all, array_find[iDataFind]);
        }
    }
}



2012年9月5日 星期三

jQuery widget 外部存取 widget 內部的屬性或 method

最近使用 jQuery ui.multiselect 的 widget 實作了一個畫面:

現在 user 想知道, 有幾個 item 被選取, 要在 widget 外部存取 widget 內部的屬性或 method, 可以這樣子做:
var widget = $(".multiselect").data("multiselect");
alert(widget.count);

這樣子就拿到 widget object 裡自行定義的屬性 count 裡的值.




資料來源:
Accesing widget instance from outside widget
http://stackoverflow.com/questions/8506621/accesing-widget-instance-from-outside-widget


jQuery UI Multiselect
http://www.quasipartikel.at/multiselect/


特別感謝:


 *  Michael Aufreiter (quasipartikel.at)
 *  Yanick Rochon (yanick.rochon[at]gmail[dot]com)


心得:
這真的是一個 "超神奇" 的 jQuery Widget, 真是令人嘆為觀止.

查出來的資料, 透過 jQuery 反白關鍵字

某一個專案, 提供了 "查詢" 功能, 允許使用者輸入某些關鍵字, 並希望查出來的資料, 遇到 user 輸入的關鍵字時, 要反白(或高亮, hightlight) 顯示.

這有2個做法.
1. Server Side 解決: web server 丟出來的資料就反白好.
2. Client Side 解決: 透過 javascript 或 jQuery 解決.

這次要分享怎麼透過 client side 解決.

step1: include jQuery
step2: 隨便給要 highlight 的 block 一個 classname
step3: 呼叫下面的 javascript, 把 block 裡的 keyword highlight.
step4: 報告完畢.


範例 jQuery 如下:
<script language='javascript'>
var keyword;
keyword = '123';
$('.Title').html(function() {
    return $(this).html().replace(keyword,"<font color=\"red\">"+keyword+"</font>");
});
$('.tel').html(function() {
    return $(this).html().replace(keyword,"<font color=\"red\">"+keyword+"</font>");
});
$('.address').html(function() {
    return $(this).html().replace(keyword,"<font color=\"red\">"+keyword+"</font>");
});

</script>
說明:
1. 把所有 class='Title' 的 block 裡出來 '123' 都變成 紅色字體.
2. 把所有 class='tel' 的 block 裡出來 '123' 都變成 紅色字體.
3. 把所有 class='address' 的 block 裡出來 '123' 都變成 紅色字體.


已知經緯度,如何查看Google Map

很多案子, 都有景點或坐標的資料, 希望 user 點了某一個 icon 就可以連到 google 去看地圖或街景:

這個 icon 的超連結要放什麼, 也很簡單, 1行就解決:
http://maps.google.com.tw/maps?gcx=w&q="& $Latitude & "%20" & $Longitude & "&um=1&ie=UTF-8&sa=N&hl=zh-TW&tab=wl


其中 URL 裡的 $Latitude 和 $Longitude 換成你要 google 指出的坐標的 緯度 + 經度 即可.

分享到 facebook, 分享到 google+ 的方法

1. 分享到 facebook, 1行 javascript 就搞定:
function Facebook() { void(window.open('http://www.facebook.com/share.php?u='.concat(encodeURIComponent(location.href)) )); }

但有一些情況會出錯, 就是你的網址裡使用的參數和 facebook 有衝突時, 例如 &lang=


2. 分享到 google+, 方法同上面的 facebook
分享的 URL 如下:
javascript:void(window.open("https://plus.google.com/share?ur\l="+encodeURIComponent(location), "Share to Google+","width=600,height=460,menubar=no,location=no,status=no"));

google+ 有另一個不錯的方法,加入這2行也ok, 而且提供的功能更多, 還可以看到 count, 如果 annotation 不要設成 none:
<script type='text/javascript' src='https://apis.google.com/js/plusone.js'></script>

<g:plusone size='standard' annotation='none' align='right'></g:plusone>

2012年9月3日 星期一

取經/緯度裡n公里裡的景點

孟諺同事提供的經/緯度運算如下:
赤道圓周=40,075.017km = 40075017m
兩極圓周=40,007.860km = 40007860m


但是因為我們的距離是 500m ~ 5000m,弧度影響甚小.所以可視為地球是平面.

360 經度 = 40075017 m ---> 每1m 為 0.000008983152770715 經度, 取10位 =0.0000089832
360 緯度 = 40007860 m ---> 每1m 為 0.000008998231847442 緯度, 取10位 =0.0000089982

因為台灣不會跨0, 直接加減就好了.

孟諺是建議型別使用: decimal(10,7)
我覺得, 其實也可以開到 decimal(18,8)

孟諺給的範例 SQL 如下:

SELECT *
FROM dbo.旅館座標表格
WHERE (經度 BETWEEN @基本經度 - @經度差距 AND @基本經度 + @經度差距)
AND (緯度 BETWEEN @基本緯度 - @緯度差距 AND @基本緯度 + @緯度差距)



我的情況是, 要把旅館(HotelInfo) 坐標的3.5公里裡的景點(RouteDetail) 資料取出來, 放到一個 路線(RouteMain) 和 旅館(HotelInfo) 的Mapping對應表(RouteHotel) 中.
insert into RouteHotel(RID,HotelInfoID)
SELECT distinct M.RID, H.hotelInfoID
FROM RouteMain M
inner join RouteDetail D on M.RID = D.RID
inner join HotelInfo H
on (D.DetailLongitude BETWEEN H.HotelLongitude - (0.0000089832 * 3500) AND H.HotelLongitude+ (0.0000089832 * 3500))
and (D.DetailLatitude BETWEEN H.HotelLatitude - (0.0000089832 * 3500) AND H.HotelLatitude + (0.0000089832 * 3500))


附上, 百大路線 + HotelInfo mapping Table schema.
CREATE TABLE [dbo].[RouteHotel](
    [RHID] [int] IDENTITY(1,1) NOT NULL,
    [RID] [int] NOT NULL,
    [HotelInfoID] [int] NOT NULL
 CONSTRAINT [PK_RouteHotel] PRIMARY KEY CLUSTERED
(
    [RID] ASC, [HotelInfoID] ASC
)
) ON [PRIMARY]


Facebook 留言板