VN-2000 ↔ WGS84 converter API
Convert Vietnamese VN-2000 x, y (sổ đỏ coordinates) to WGS84 lat / lon, UTM or back, with the province central meridian, parcel area and GeoJSON.
Converts coordinates between the Vietnamese national system VN-2000 and WGS84: plane coordinates x (northing), y (easting) in the 3° transverse Mercator zone of a province (k0 = 0.9999, the system printed on land-use certificates) or 6° UTM zones, VN-2000 latitude / longitude, WGS84 latitude / longitude (GPS, Google Maps) and WGS84 UTM. The datum shift uses the official seven parameters of TT 973/2001/TT-TCĐC and QĐ 05/2007/QĐ-BTNMT (EPSG:6960); the projection uses the Krüger series, accurate to the millimetre.
Pass province (any of the 63 former provinces or the 34 current ones) and the central meridian of TT 973/2001 is used; for a merged province the response warns when its former provinces have different meridians, because cadastral records keep the meridian of the former province. Or pass meridian directly (105.75 or 105°45').
With three or more points the parcel area and perimeter are computed on the projection plane, as cadastral maps do. format=geojson returns a GeoJSON polygon ready for Google Maps or QGIS. Accuracy between datums is about 1 m: fine for maps, not for legal surveys.
Parameters
| Name | In | Type | Required | Default | |
|---|---|---|---|---|---|
points | body|query | array | yes | Points: array of [x, y] or [lat, lon], or one pair per line (as printed on the certificate). Single point: x + y or lat + lon. | |
from | body|query | string | no | vn2000 | vn2000 (plane x, y), vn2000_geo, wgs84, utm, vn2000_utm. |
to | body|query | string | no | wgs84 | Target system (same values). |
province | body|query | string | no | Province for the central meridian (63 former or 34 current names). | |
meridian | body|query | string | no | Central meridian, e.g. 105.75 or 105°45'. | |
zone_width | body|query | number | no | 3 | 3 (k0 0.9999) or 6 (k0 0.9996). |
format | body|query | string | no | json | json or geojson. |
Example
curl -X POST "https://apibox.io.vn/v1/vn-vn2000" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"points":[[1192000,600000],[1192000,600020],[1191980,600020],[1191980,600000]],"province":"Hồ Chí Minh"}'const res = await fetch('https://apibox.io.vn/v1/vn-vn2000', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"points": [
[
1192000,
600000
],
[
1192000,
600020
],
[
1191980,
600020
],
[
1191980,
600000
]
],
"province": "Hồ Chí Minh"
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/vn-vn2000",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"points": [[1192000, 600000], [1192000, 600020], [1191980, 600020], [1191980, 600000]], "province": "Hồ Chí Minh"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/vn-vn2000');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"points":[[1192000,600000],[1192000,600020],[1191980,600020],[1191980,600000]],"province":"Hồ Chí Minh"}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Response
{
"from": "vn2000",
"to": "wgs84",
"meridian": "105°45'",
"meridian_deg": 105.75,
"zone_width": 3,
"k0": 0.9999,
"province": {
"former_province": "Hồ Chí Minh",
"province_since_2025": "Hồ Chí Minh",
"meridian": "105°45'",
"meridian_deg": 105.75,
"warning": "Since 1/7/2025 Hồ Chí Minh also includes Bình Dương (105°45'), Bà Rịa - Vũng Tàu (107°45'); cadastral records keep the meridian of the former province where the parcel lies."
},
"count": 4,
"points": [
{
"wgs84": {
"lat": 10.77752619,
"lon": 106.66618296
},
"vn2000_geo": {
"lat": 10.77854448,
"lon": 106.66439662
},
"vn2000": {
"x": 1192000,
"y": 600000
},
"result": {
"lat": 10.77752619,
"lon": 106.66618296
}
},
{
"wgs84": {
"lat": 10.77752565,
"lon": 106.66636582
},
"vn2000_geo": {
"lat": 10.77854394,
"lon": 106.66457948
},
"vn2000": {
"x": 1192000,
"y": 600020
},
"result": {
"lat": 10.77752565,
"lon": 106.66636582
}
}
],
"polygon": {
"area_m2": 400,
"perimeter_m": 80,
"plane": "VN-2000 TM 3°, meridian 105°45', k0 0.9999"
},
"legal": {
"system": "VN-2000, QĐ 83/2000/QĐ-TTg",
"projection": "TT 973/2001/TT-TCĐC (k0 0.9999 for 3° zones, 0.9996 for 6°)",
"transform": "7 parameters of TT 973/2001 / QĐ 05/2007/QĐ-BTNMT (EPSG:6960, coordinate frame)"
},
"accuracy": "About 1 m between VN-2000 and WGS84 (national 7-parameter set; local parameter sets of a province can be more accurate). Not a substitute for a licensed survey in cadastral dossiers."
}
Use cases
- Show a land plot from its certificate on Google Maps
- Import surveyed parcels into a GIS or a real-estate app
- Check the area printed on a land-use certificate
- Convert GPS points to VN-2000 for a survey drawing
FAQ
Which order are x and y?
VN-2000 lists x = northing (about 1–2.6 million m) first, y = easting (about 400–700 thousand m). Swapped pairs are detected and fixed with a warning.
Which central meridian should I use?
The one of the province where the parcel lies (TT 973/2001); for merged provinces use the former province. The certificate often prints it (e.g. KTT 105°45', múi chiếu 3°).
How accurate is it?
The projection is exact to the millimetre; the national 7-parameter datum shift is accurate to about 1 m (checked against published VN-2000 / WGS84 pairs of TT 47/2025/TT-BXD).
Related APIs
JSON Validator
Check JSON syntax with exact line and column of errors, and validate data against a JSON Schema (draft 4, 7, 2019-09 or 2020-12).
{ }JSON Formatter
Pretty print JSON with 0-8 spaces or tabs, minify it, or sort object keys recursively. Syntax errors are reported with line and column.
CSVCSV to JSON
Convert CSV into an array of JSON objects using the header row, with delimiter auto-detection, number and boolean typing, and row-level errors.