텔레픽스
경력근거: 위성영상·지리공간 데이터와 AI 모델 (LLM/Agent, Vision) 을 결합한 PoC 및 서비스 구현
텔레픽스는 위성용 광학 탑재체를 만들고, 위성영상을 AI 로 분석하는 소프트웨어도 만드는 우주 AI 회사예요. 자연어로 위성영상을 검색·분석하는 SatCHAT 을 국내 공공기관에 공급하고 있고, SatCHAT 의 기능에는 광학·SAR 영상 선박 탐지와 AIS·RF 신호 교차 확인이 있어요.
공고는 이 자리가 할 일로 '위성영상·지리공간 데이터와 AI 모델 (LLM/Agent, Vision) 을 결합한 PoC 및 서비스 구현'을 꼽고, 우대사항에 '지리공간 데이터 처리 경험 (GeoTIFF, GDAL, PostGIS, 광학·SAR 영상 등)'을 적었어요. 텔레픽스가 공공기관에 공급하는 SatCHAT 에도 광학·SAR 영상 선박 탐지와 AIS·RF 신호 교차 확인 기능이 있어요. 위성은 정해진 순간에 한 번 찍고 AIS 위치 보고는 선박마다 제각각의 시각에 들어오기 때문에, 영상 속 선박과 AIS 선박을 같은 배로 묶으려면 시각과 위치를 함께 맞춰 봐야 해요. AIS 를 끄거나 크기를 다르게 신고한 선박은 그렇게 맞춰 봐야 드러나요.
공고는 위성영상·지리공간 데이터와 LLM/Agent·Vision 모델을 결합한 PoC 와 서비스 구현을 이 자리가 할 일로 꼽아요. 온프레미스·폐쇄망을 포함한 고객 환경에 배포하고 운영을 안정화하는 일도 맡겨요.
공고는 고객 업무와 도메인을 분석해 문제를 정의하고, 요구사항을 도출해 솔루션을 설계하는 일을 맡겨요. 아직 명확하게 정의되지 않은 문제를 기술적 문제로 구조화하는 엔지니어를 찾는다고 적었어요.
우대사항에 GeoTIFF·GDAL·PostGIS 같은 지리공간 데이터와 광학·SAR 영상을 다뤄 본 경험, 공공기관 사업을 수행해 본 경험을 적었어요.
해양 감시 담당자가 위성이 관할 해역을 찍을 때마다 여는 관리자 페이지예요. 촬영 회차마다 영상에 찍힌 선박을 촬영 즈음 받은 AIS 위치 보고와 맞춰 보여 주고, AIS 신호가 없는 선박, 신고한 길이와 영상 속 크기가 다른 선박, AIS 로는 촬영 범위 안에 있었는데 영상에서 찾은 어느 선박과도 짝이 맞지 않는 선박을 따로 묶어 알려 줘요. 받은 데이터를 담을 DB 설계와 기술·구조, 그리고 같은 배로 볼 시간·거리 기준과 길이 차이를 어디까지 같다고 볼지는 지원자가 정해요.
위성영상으로 관할 해역을 살피는 공공기관의 해양 감시 담당자예요. 영상 한 장에 찍힌 선박을 AIS 지도와 하나씩 손으로 맞춰 보면, 촬영할 때마다 확인이 늦어지고 AIS 신호가 없거나 신고와 다른 선박을 놓치기 쉬워요.
위성이 관할 해역을 찍은 촬영 회차예요. 한 행이 촬영 한 번(영상 한 장)이고 scene_id 가 키예요. sensor 는 optical(광학)과 sar(SAR) 둘 중 하나예요. acquired_at 은 영상 정보에 적힌 촬영 시각으로, 위성의 GNSS 시계로 찍은 UTC 시각을 한국 시간(+09:00)으로 적었어요. ais_reports.reported_at 도 같은 UTC 기준이라 그대로 견줄 수 있어요. 촬영 범위는 위도 min_lat~max_lat, 경도 min_lon~max_lon 으로 적은 사각형이고 경계선도 범위 안이에요. 관할 해역은 서해의 북위 36.3~37.1도, 동경 125.2~126.0도 범위이고, 회차마다 그 안에서 촬영 범위의 위치와 크기가 달라요. 큰 데이터는 2026년 7월 19일부터 10월 16일까지 90일 동안 하루 두 번(오전 광학, 저녁 SAR) 찍은 180회차이고, 시작용은 그중 10월 16일 오전 광학 회차 하나를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 1행 가운데 앞 1행이에요.
| scene_id | sensor | acquired_at | min_lat | max_lat | min_lon | max_lon |
|---|---|---|---|---|---|---|
| SC-0179 | optical | 2026-10-16T10:42:18+09:00 | 36.612 | 36.768 | 125.604 | 125.796 |
1행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 180행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "위성 촬영 한 번. 키는 scene_id.",
"additionalProperties": false,
"required": [
"scene_id",
"sensor",
"acquired_at",
"min_lat",
"max_lat",
"min_lon",
"max_lon"
],
"properties": {
"scene_id": {
"type": "string",
"pattern": "^SC-[0-9]{4}$",
"description": "촬영 회차 번호. 이 표의 키예요."
},
"sensor": {
"type": "string",
"enum": [
"optical",
"sar"
],
"description": "촬영 센서. optical 은 광학 영상, sar 는 SAR 영상이에요."
},
"acquired_at": {
"type": "string",
"format": "date-time",
"description": "영상 정보에 적힌 촬영 시각. 위성의 GNSS 시계(UTC 기준)로 찍은 시각을 한국 시간(+09:00) ISO 8601, 초 단위로 적었어요."
},
"min_lat": {
"type": "number",
"description": "촬영 범위 남쪽 끝 위도(WGS84, 도). 경계선도 범위 안이에요."
},
"max_lat": {
"type": "number",
"description": "촬영 범위 북쪽 끝 위도(WGS84, 도)."
},
"min_lon": {
"type": "number",
"description": "촬영 범위 서쪽 끝 경도(WGS84, 도)."
},
"max_lon": {
"type": "number",
"description": "촬영 범위 동쪽 끝 경도(WGS84, 도)."
}
}
}촬영 회차마다 영상에서 찾은 선박이에요. 한 행이 탐지 하나이고 detection_id 가 키예요. scene_id 는 satellite_scenes.scene_id 를 가리키고, 탐지 하나는 한 회차에만 속해요. lat·lon 은 영상에서 잡힌 선체 가운데의 위치(WGS84, 도), length_m 은 영상에서 잰 선체 길이(m, 정수)라 실제 길이와 조금씩 차이가 나요. 탐지에는 MMSI 가 없어요 — 영상만으로는 어느 배인지 알 수 없어요. 이 데이터의 탐지는 모두 실제 선박이고, 길이 10m 안팎의 작은 배는 영상에 잡히지 않기도 해요. 두 척이 나란히 붙어 있으면 한 척으로 잡혀요. AIS 를 켠 배 옆에서 같은 침로로 움직이는 배, 영상에서 잰 길이가 AIS 신고 길이와 크게 다른 배, 빠르게 지나가는 여객선이 들어 있어요. 큰 데이터는 180회차에서 찾은 3,706척이고, 시작용은 10월 16일 오전 광학 회차에서 찾은 11척 전부예요.
전체 11행 가운데 앞 5행이에요.
| detection_id | scene_id | lat | lon | length_m |
|---|---|---|---|---|
| D-003687 | SC-0179 | 36.727 | 125.664 | 121 |
| D-003688 | SC-0179 | 36.658 | 125.644 | 36 |
| D-003689 | SC-0179 | 36.655 | 125.642 | 39 |
| D-003690 | SC-0179 | 36.701 | 125.623 | 58 |
| D-003691 | SC-0179 | 36.695 | 125.697 | 141 |
11행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 3,706행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "영상에서 찾은 선박 하나. 키는 detection_id.",
"additionalProperties": false,
"required": [
"detection_id",
"scene_id",
"lat",
"lon",
"length_m"
],
"properties": {
"detection_id": {
"type": "string",
"pattern": "^D-[0-9]{6}$",
"description": "탐지 번호. 이 표의 키예요."
},
"scene_id": {
"type": "string",
"pattern": "^SC-[0-9]{4}$",
"description": "이 선박을 찾은 촬영 회차. satellite_scenes.scene_id 를 가리켜요."
},
"lat": {
"type": "number",
"description": "영상에서 잡힌 선체 가운데의 위도(WGS84, 도)."
},
"lon": {
"type": "number",
"description": "영상에서 잡힌 선체 가운데의 경도(WGS84, 도)."
},
"length_m": {
"type": "integer",
"minimum": 1,
"description": "영상에서 잰 선체 길이(m, 정수)."
}
}
}AIS 로 받은 선박의 정적 정보예요. 한 행이 선박 하나이고 mmsi(9자리 선박 식별번호)가 키예요. ship_type 은 선박이 신고한 선종(fishing 어선, cargo 화물선, tanker 유조선, passenger 여객선, tug 예인선), ship_length_m 은 선박이 신고한 길이(m, 정수)예요. 이 기간에 선박마다 신고 내용은 바뀌지 않았어요. 신고 길이가 실제 선체 길이와 다른 선박도 있어요. 큰 데이터는 90일 동안 위치 보고를 한 번이라도 보낸 1,893척이고, 시작용은 10월 16일 오전 광학 회차 앞뒤 12분에 위치 보고를 보낸 12척이에요.
전체 12행 가운데 앞 5행이에요.
| mmsi | ship_type | ship_length_m |
|---|---|---|
| 351802746 | cargo | 132 |
| 412408763 | fishing | 38 |
| 440119462 | passenger | 139 |
| 440213570 | cargo | 118 |
| 440336918 | tanker | 145 |
12행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 1,893행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "AIS 정적 정보로 신고한 선박 하나. 키는 mmsi.",
"additionalProperties": false,
"required": [
"mmsi",
"ship_type",
"ship_length_m"
],
"properties": {
"mmsi": {
"type": "string",
"pattern": "^[0-9]{9}$",
"description": "9자리 선박 식별번호(MMSI). 이 표의 키예요."
},
"ship_type": {
"type": "string",
"enum": [
"fishing",
"cargo",
"tanker",
"passenger",
"tug"
],
"description": "선박이 신고한 선종. fishing 어선, cargo 화물선, tanker 유조선, passenger 여객선, tug 예인선."
},
"ship_length_m": {
"type": "integer",
"minimum": 1,
"description": "선박이 AIS 정적 정보로 신고한 길이(m, 정수)."
}
}
}AIS 로 받은 선박 위치 보고예요. 한 행이 보고 하나이고 mmsi 와 reported_at 묶음이 키예요. mmsi 는 ais_vessels.mmsi 를 가리켜요. reported_at 은 AIS 수신국이 보고를 받은 시각으로, GNSS 로 맞춘 UTC 시계를 한국 시간(+09:00)으로 적었어요. lat·lon 은 보고에 담긴 선박 위치(WGS84, 도), sog_knots 는 대지 속력(노트), cog_deg 는 대지 침로(도, 북쪽 0 에서 시계 방향)예요. 멈춰 있는 배는 sog_knots 가 0.0 이고 보고 위치가 그대로예요. 이 데이터에는 회차마다 촬영 시각 앞뒤 12분 동안, 촬영 범위를 사방으로 위도·경도 0.03도씩 넓힌 범위 안에서 받은 보고만 들어 있고, 선박마다 보고는 대개 3~8분 간격으로 들어와요. 촬영 직후에야 보고가 들어오기 시작한 선박, 촬영 범위 밖에 있거나 촬영 전에 범위를 빠져나간 선박, 영상에 잡히지 않을 만큼 작은 배, 두 척이 나란히 붙어 멈춰 있는 경우가 들어 있어요. 큰 데이터는 180회차 동안 받은 보고 26,109건이고, 시작용은 10월 16일 오전 광학 회차 앞뒤 12분에 받은 보고 47건 전부예요.
전체 47행 가운데 앞 5행이에요.
| mmsi | reported_at | lat | lon | sog_knots | cog_deg |
|---|---|---|---|---|---|
| 440508126 | 2026-10-16T10:30:36+09:00 | 36.716 | 125.781 | 0 | 87 |
| 441360587 | 2026-10-16T10:30:36+09:00 | 36.741 | 125.75 | 2 | 10 |
| 440917253 | 2026-10-16T10:30:54+09:00 | 36.654 | 125.794 | 7 | 250 |
| 440871024 | 2026-10-16T10:31:18+09:00 | 36.667 | 125.72 | 0 | 212 |
| 412408763 | 2026-10-16T10:31:42+09:00 | 36.649 | 125.655 | 4.1 | 300 |
47행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 26,109행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "AIS 위치 보고 하나. 키는 (mmsi, reported_at) 묶음.",
"additionalProperties": false,
"required": [
"mmsi",
"reported_at",
"lat",
"lon",
"sog_knots",
"cog_deg"
],
"properties": {
"mmsi": {
"type": "string",
"pattern": "^[0-9]{9}$",
"description": "보고를 보낸 선박. ais_vessels.mmsi 를 가리켜요."
},
"reported_at": {
"type": "string",
"format": "date-time",
"description": "AIS 수신국이 보고를 받은 시각. GNSS 로 맞춘 UTC 시계를 한국 시간(+09:00) ISO 8601, 초 단위로 적었어요."
},
"lat": {
"type": "number",
"description": "보고에 담긴 선박 위도(WGS84, 도)."
},
"lon": {
"type": "number",
"description": "보고에 담긴 선박 경도(WGS84, 도)."
},
"sog_knots": {
"type": "number",
"minimum": 0,
"description": "보고에 담긴 대지 속력(노트, 소수 한 자리)."
},
"cog_deg": {
"type": "number",
"minimum": 0,
"maximum": 360,
"description": "보고에 담긴 대지 침로(도, 북쪽 0 에서 시계 방향, 소수 한 자리)."
}
}
}