korean-transit-route
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinesekorean-transit-route
韩国公共交通路线规划
한국 대중교통(지하철+버스+도보) 도어투도어 길찾기 스킬. ODsay LIVE API + Kakao Local geocoding.
韩国公共交通(地铁+公交+步行)门到门路线查询工具。基于ODsay LIVE API + Kakao Local地理编码。
When to use
使用场景
- "강남에서 잠실 지하철로 어떻게 가?"
- "서울역 → 인천공항 대중교통 경로"
- "환승 가장 적은 경로", "최소 시간 경로"
- "강남에서 잠실 지하철로 어떻게 가?"(江南到蚕室地铁怎么走?)
- "서울역 → 인천공항 대중교통 경로"(首尔站→仁川机场公共交通路线)
- "환승 가장 적은 경로"(换乘最少的路线)、"최소 시간 경로"(耗时最短的路线)
Credentials
凭据配置
- 환경변수 가 있으면 사용. 없으면
ODSAY_API_KEY에서 로드.~/.config/k-skill/secrets.env - ODsay Server 키는 호출 IP 화이트리스트 등록 필수. 발급은 https://lab.odsay.com
- Kakao Local geocoding은 기본 hosted 경유로 호출하므로 사용자 쪽
k-skill-proxy는 불필요하다. self-host proxy 운영자만KAKAO_REST_API_KEY를 서버에 설정한다.KAKAO_REST_API_KEY
- 若存在环境变量则直接使用,否则从
ODSAY_API_KEY加载。~/.config/k-skill/secrets.env - ODsay Server密钥必须注册调用IP白名单,可通过https://lab.odsay.com申请。
- Kakao Local地理编码默认通过托管的调用,因此用户无需配置
k-skill-proxy;仅自行托管代理的运营者需在服务器上设置KAKAO_REST_API_KEY。KAKAO_REST_API_KEY
Inputs
输入处理
자연어 입력에서 출발/도착을 추출. 좌표가 없으면 반드시 geocoding 먼저 (ODsay는 좌표만 받음).
从自然语言输入中提取出发地/目的地。若无坐标,必须先进行地理编码(ODsay仅接受坐标输入)。
Geocoding (필수 선행 단계)
地理编码(必要前置步骤)
기본 hosted proxy를 사용한다. Proxy가 Kakao Local REST API 키를 서버에서만 주입하고, caller 는 무시한다.
apiKeyhttps://k-skill-proxy.nomadamas.org/v1/kakao-local/geocode?q=<주소/장소명>- proxy 내부 fallback: Kakao Local → 결과 없으면
address.jsonkeyword.json
응답 (경도), (위도) 사용.
documents[0].x.ypython
import os, urllib.parse, urllib.request, json
PROXY=os.environ.get('KSKILL_PROXY_BASE_URL','https://k-skill-proxy.nomadamas.org').rstrip('/')
def geocode(q):
url=PROXY+'/v1/kakao-local/geocode?q='+urllib.parse.quote(q)
with urllib.request.urlopen(url,timeout=10) as resp:
d=json.loads(resp.read())
if d.get('documents'):
doc=d['documents'][0]
return float(doc['x']), float(doc['y']), doc.get('place_name') or doc.get('address_name')
return None지하철역명만 정확히 알 때는 ODsay 도 OK 하지만, 도어투도어 결과를 원하면 실제 출발지/도착지 좌표를 써야 첫/끝 도보 구간이 계산됨.
searchStation使用默认托管代理。代理仅在服务器端注入Kakao Local REST API密钥,调用者提供的将被忽略。
apiKeyhttps://k-skill-proxy.nomadamas.org/v1/kakao-local/geocode?q=<地址/场所名称>- 代理内部降级逻辑:先调用Kakao Local → 若无结果则调用
address.jsonkeyword.json
使用响应中的(经度)、(纬度)。
documents[0].x.ypython
import os, urllib.parse, urllib.request, json
PROXY=os.environ.get('KSKILL_PROXY_BASE_URL','https://k-skill-proxy.nomadamas.org').rstrip('/')
def geocode(q):
url=PROXY+'/v1/kakao-local/geocode?q='+urllib.parse.quote(q)
with urllib.request.urlopen(url,timeout=10) as resp:
d=json.loads(resp.read())
if d.get('documents'):
doc=d['documents'][0]
return float(doc['x']), float(doc['y']), doc.get('place_name') or doc.get('address_name')
return None若仅准确知道地铁站名,也可使用ODsay的接口,但如果需要门到门结果,必须使用实际出发地/目的地坐标,才能计算首尾步行路段。
searchStationCore call
核心调用
bash
set -a; . ~/.config/k-skill/secrets.env; set +a
KEY=$(python3 -c "import os,urllib.parse;print(urllib.parse.quote(os.environ['ODSAY_API_KEY'],safe=''))")
curl -s "https://api.odsay.com/v1/api/searchPubTransPathT?apiKey=${KEY}&SX=${SX}&SY=${SY}&EX=${EX}&EY=${EY}&OPT=0&SearchPathType=${TYPE}"Parameters:
- 출발 경도/위도,
SX,SY도착 경도/위도 (WGS84)EX,EY - :
OPT추천순(기본),0최소시간,4최소환승5 - :
SearchPathType지하철+버스,0지하철만,1버스만2
bash
set -a; . ~/.config/k-skill/secrets.env; set +a
KEY=$(python3 -c "import os,urllib.parse;print(urllib.parse.quote(os.environ['ODSAY_API_KEY'],safe=''))")
curl -s "https://api.odsay.com/v1/api/searchPubTransPathT?apiKey=${KEY}&SX=${SX}&SY=${SY}&EX=${EX}&EY=${EY}&OPT=0&SearchPathType=${TYPE}"参数说明:
- :出发地经度/纬度,
SX,SY:目的地经度/纬度(WGS84坐标系)EX,EY - :
OPT推荐顺序(默认),0耗时最短,4换乘最少5 - :
SearchPathType地铁+公交,0仅地铁,1仅公交2
Response shape
响应结构
result.path[]- : 1=지하철, 2=버스, 3=지하철+버스
pathType - (분),
info.totalTime(원),info.payment,info.subwayTransitCount,info.busTransitCount(m),info.totalWalk,info.firstStartStationinfo.lastEndStation - : 구간별.
subPath[]1=지하철 2=버스 3=도보. 지하철이면trafficType,lane[0].name,startName,endName(경유역)passStopList.stations[]
result.path[]- :1=地铁,2=公交,3=地铁+公交
pathType - (分钟)、
info.totalTime(韩元)、info.payment、info.subwayTransitCount、info.busTransitCount(米)、info.totalWalk、info.firstStartStationinfo.lastEndStation - :各路段信息。
subPath[]1=地铁 2=公交 3=步行。若为地铁,包含trafficType、lane[0].name、startName、endName(途经站点)passStopList.stations[]
Recommended output (door-to-door)
推荐输出格式(门到门)
subPathtrafficType🚇 범안로95번길 32 → SKT타워
경로 1: 54분 · 1,950원 · 환승 2회 · 도보 688m
🚶 도보 1분
🚌 19번 부천범박힐스테이트 → 역곡역 (9분)
🚶 도보 2분
🚇 1호선 역곡 → 종각 (15정거장, 35분)
🚶 도보 7분3개 이내 경로 비교 권장. (최소시간) / (최소환승) 옵션을 사용자가 선호 표시하면 그쪽으로 호출.
OPT=4OPT=5按展示的每个路段。首尾步行路段代表从出发地/目的地到车站的实际步行路线,必须包含。
trafficTypesubPath🚇 범안로95번길 32 → SKT타워
路线1:54分钟 · 1,950韩元 · 换乘2次 · 步行688米
🚶 步行1分钟
🚌 19路 富川范朴山庄 → 谷洞站(9分钟)
🚶 步行2分钟
🚇 1号线 谷洞 → 钟阁(15站,35分钟)
🚶 步行7分钟建议最多展示3条路线进行对比。若用户明确偏好(耗时最短)/(换乘最少),则调用对应选项。
OPT=4OPT=5Done when
完成标准
- 출발지와 도착지가 geocoding 되었거나, 좌표/역명이 명확히 확인되었다.
- ODsay 응답에서 1개 이상 경로가 정리되었다.
- 각 경로의 총 소요시간, 요금, 환승 횟수, 총 도보 거리가 포함되었다.
- 첫/끝 도보 구간이 포함된 door-to-door 요약을 보여줬다.
- upstream API 키가 응답에 노출되지 않았다.
- 出发地和目的地已完成地理编码,或坐标/站名已明确确认。
- 从ODsay响应中整理出1条及以上路线。
- 每条路线包含总耗时、费用、换乘次数、总步行距离。
- 展示包含首尾步行路段的门到门路线摘要。
- 上游API密钥未在响应中泄露。
Helpers
辅助工具
좌표 모르고 역명만 아는 경우 — 으로 변환:
searchStationbash
curl -s "https://api.odsay.com/v1/api/searchStation?apiKey=${KEY}&stationName=강남&CID=1000"CID=1000result.station[].x,y若仅知道站名而无坐标,可通过接口转换:
searchStationbash
curl -s "https://api.odsay.com/v1/api/searchStation?apiKey=${KEY}&stationName=강남&CID=1000"CID=1000result.station[].x,yLimits
限制说明
- 현재 ODsay 공식 Basic 상품 기준 무료 체험은 일 1,000건(6개월)이다. +
searchPubTransPathT호출이 합산되니 한 질문당 호출 최소화.searchStation - 응답에 키 있으면 즉시 사용자에게 표시(ApiKey/IP 문제 진단에 유용).
error - 한국 외 좌표는 지원 안 함.
- 当前ODsay官方Basic套餐的免费体验额度为每日1000次(有效期6个月),和
searchPubTransPathT的调用次数会累加,因此需尽量减少单次查询的调用次数。searchStation - 若响应中包含字段,需立即展示给用户(有助于诊断ApiKey/IP问题)。
error - 不支持韩国境外的坐标。
Failure modes
故障处理
- ODsay 응답:
error필드를 그대로 사용자에게 표시하고, ApiKey 미등록 또는 IP 화이트리스트 누락 가능성을 안내한다.msg - Kakao geocoding 결과 없음: 주소/장소명을 다시 확인하거나 더 구체적인 표현을 요청한다.
- 좌표는 있으나 ODsay 경로 없음: 대중교통 미개통 지역, 도보 가능 거리, 또는 해상/공항 구간일 수 있다. 사용자에게 확인한다.
- quota 초과: 일일 한도 도달 시 추가 호출을 중단하고 사용자에게 알린다.
- ODsay返回响应:直接向用户展示
error字段内容,并提示可能存在ApiKey未注册或IP白名单遗漏的问题。msg - Kakao地理编码无结果:请求用户重新确认地址/场所名称,或提供更具体的表述。
- 有坐标但ODsay无路线结果:可能是公共交通未覆盖区域、仅可步行区域,或涉及海上/机场路段,需向用户确认。
- 配额超限:当日额度用尽时,停止后续调用并告知用户。
Don'ts
注意事项
- 카카오맵/네이버지도 directions API로 대중교통 라우팅 시도하지 말 것 (둘 다 운전·도보만 공개).
- 키를 절대 응답에 노출하지 말 것.
- 请勿尝试使用 Kakao Map/Naver Map Directions API进行公共交通路线规划(二者仅公开驾车/步行路线)。
- 绝对禁止在响应中泄露密钥。