debugged build precision values on decimal places inside nocodb
This commit is contained in:
parent
08782379ab
commit
2b05b608ba
@ -121,10 +121,10 @@ class LocationsController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format geodata
|
// Format geodata with string values to preserve precision
|
||||||
const geodata = `${validation.latitude};${validation.longitude}`;
|
const geodata = `${validation.latitude};${validation.longitude}`;
|
||||||
|
|
||||||
// Prepare data for NocoDB
|
// Prepare data for NocoDB - keep coordinates as strings
|
||||||
const finalData = {
|
const finalData = {
|
||||||
geodata,
|
geodata,
|
||||||
'Geo-Location': geodata,
|
'Geo-Location': geodata,
|
||||||
|
|||||||
@ -36,8 +36,8 @@ setInterval(() => {
|
|||||||
* @returns {Promise<Object>} Geocoding result
|
* @returns {Promise<Object>} Geocoding result
|
||||||
*/
|
*/
|
||||||
async function reverseGeocode(lat, lng) {
|
async function reverseGeocode(lat, lng) {
|
||||||
// Create cache key
|
// Create cache key - use full precision
|
||||||
const cacheKey = `${lat.toFixed(6)},${lng.toFixed(6)}`;
|
const cacheKey = `${lat},${lng}`;
|
||||||
|
|
||||||
// Check cache first
|
// Check cache first
|
||||||
const cached = geocodeCache.get(cacheKey);
|
const cached = geocodeCache.get(cacheKey);
|
||||||
|
|||||||
@ -2,12 +2,16 @@
|
|||||||
function syncGeoFields(data) {
|
function syncGeoFields(data) {
|
||||||
// If we have latitude and longitude but no Geo-Location, create it
|
// If we have latitude and longitude but no Geo-Location, create it
|
||||||
if (data.latitude && data.longitude && !data['Geo-Location']) {
|
if (data.latitude && data.longitude && !data['Geo-Location']) {
|
||||||
const lat = parseFloat(data.latitude);
|
// Keep as strings to preserve precision
|
||||||
const lng = parseFloat(data.longitude);
|
const lat = typeof data.latitude === 'string' ? data.latitude : String(data.latitude);
|
||||||
if (!isNaN(lat) && !isNaN(lng)) {
|
const lng = typeof data.longitude === 'string' ? data.longitude : String(data.longitude);
|
||||||
|
|
||||||
data['Geo-Location'] = `${lat};${lng}`;
|
data['Geo-Location'] = `${lat};${lng}`;
|
||||||
data.geodata = `${lat};${lng}`;
|
data.geodata = `${lat};${lng}`;
|
||||||
}
|
|
||||||
|
// Keep original values without parsing
|
||||||
|
data.latitude = lat;
|
||||||
|
data.longitude = lng;
|
||||||
}
|
}
|
||||||
// If we have Geo-Location but no lat/lng, parse it
|
// If we have Geo-Location but no lat/lng, parse it
|
||||||
else if (data['Geo-Location'] && (!data.latitude || !data.longitude)) {
|
else if (data['Geo-Location'] && (!data.latitude || !data.longitude)) {
|
||||||
@ -16,9 +20,12 @@ function syncGeoFields(data) {
|
|||||||
// Try semicolon-separated first
|
// Try semicolon-separated first
|
||||||
let parts = geoLocation.split(';');
|
let parts = geoLocation.split(';');
|
||||||
if (parts.length === 2) {
|
if (parts.length === 2) {
|
||||||
const lat = parseFloat(parts[0].trim());
|
// Keep as strings to preserve precision
|
||||||
const lng = parseFloat(parts[1].trim());
|
const lat = parts[0].trim();
|
||||||
if (!isNaN(lat) && !isNaN(lng)) {
|
const lng = parts[1].trim();
|
||||||
|
|
||||||
|
// Only validate they're numeric, don't convert
|
||||||
|
if (!isNaN(parseFloat(lat)) && !isNaN(parseFloat(lng))) {
|
||||||
data.latitude = lat;
|
data.latitude = lat;
|
||||||
data.longitude = lng;
|
data.longitude = lng;
|
||||||
data.geodata = `${lat};${lng}`;
|
data.geodata = `${lat};${lng}`;
|
||||||
@ -29,9 +36,10 @@ function syncGeoFields(data) {
|
|||||||
// Try comma-separated
|
// Try comma-separated
|
||||||
parts = geoLocation.split(',');
|
parts = geoLocation.split(',');
|
||||||
if (parts.length === 2) {
|
if (parts.length === 2) {
|
||||||
const lat = parseFloat(parts[0].trim());
|
const lat = parts[0].trim();
|
||||||
const lng = parseFloat(parts[1].trim());
|
const lng = parts[1].trim();
|
||||||
if (!isNaN(lat) && !isNaN(lng)) {
|
|
||||||
|
if (!isNaN(parseFloat(lat)) && !isNaN(parseFloat(lng))) {
|
||||||
data.latitude = lat;
|
data.latitude = lat;
|
||||||
data.longitude = lng;
|
data.longitude = lng;
|
||||||
data.geodata = `${lat};${lng}`;
|
data.geodata = `${lat};${lng}`;
|
||||||
@ -44,6 +52,46 @@ function syncGeoFields(data) {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate coordinates
|
||||||
|
function validateCoordinates(lat, lng) {
|
||||||
|
// Keep original string values
|
||||||
|
const latStr = typeof lat === 'string' ? lat : String(lat);
|
||||||
|
const lngStr = typeof lng === 'string' ? lng : String(lng);
|
||||||
|
|
||||||
|
// Parse only for validation
|
||||||
|
const latitude = parseFloat(latStr);
|
||||||
|
const longitude = parseFloat(lngStr);
|
||||||
|
|
||||||
|
if (isNaN(latitude) || isNaN(longitude)) {
|
||||||
|
return { valid: false, error: 'Invalid coordinate values' };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (latitude < -90 || latitude > 90) {
|
||||||
|
return { valid: false, error: 'Latitude must be between -90 and 90' };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (longitude < -180 || longitude > 180) {
|
||||||
|
return { valid: false, error: 'Longitude must be between -180 and 180' };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the original string values to preserve precision
|
||||||
|
return { valid: true, latitude: latStr, longitude: lngStr };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if coordinates are within bounds
|
||||||
|
function checkBounds(lat, lng, bounds) {
|
||||||
|
if (!bounds) return true;
|
||||||
|
|
||||||
|
// Parse only for comparison
|
||||||
|
const latitude = parseFloat(lat);
|
||||||
|
const longitude = parseFloat(lng);
|
||||||
|
|
||||||
|
return latitude <= bounds.north &&
|
||||||
|
latitude >= bounds.south &&
|
||||||
|
longitude <= bounds.east &&
|
||||||
|
longitude >= bounds.west;
|
||||||
|
}
|
||||||
|
|
||||||
// Validate URL format
|
// Validate URL format
|
||||||
function validateUrl(url) {
|
function validateUrl(url) {
|
||||||
if (!url || typeof url !== 'string') {
|
if (!url || typeof url !== 'string') {
|
||||||
@ -101,36 +149,6 @@ function extractId(record) {
|
|||||||
return record.Id || record.id || record.ID || record._id;
|
return record.Id || record.id || record.ID || record._id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate coordinates
|
|
||||||
function validateCoordinates(lat, lng) {
|
|
||||||
const latitude = parseFloat(lat);
|
|
||||||
const longitude = parseFloat(lng);
|
|
||||||
|
|
||||||
if (isNaN(latitude) || isNaN(longitude)) {
|
|
||||||
return { valid: false, error: 'Invalid coordinate values' };
|
|
||||||
}
|
|
||||||
|
|
||||||
if (latitude < -90 || latitude > 90) {
|
|
||||||
return { valid: false, error: 'Latitude must be between -90 and 90' };
|
|
||||||
}
|
|
||||||
|
|
||||||
if (longitude < -180 || longitude > 180) {
|
|
||||||
return { valid: false, error: 'Longitude must be between -180 and 180' };
|
|
||||||
}
|
|
||||||
|
|
||||||
return { valid: true, latitude, longitude };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if coordinates are within bounds
|
|
||||||
function checkBounds(lat, lng, bounds) {
|
|
||||||
if (!bounds) return true;
|
|
||||||
|
|
||||||
return lat <= bounds.north &&
|
|
||||||
lat >= bounds.south &&
|
|
||||||
lng <= bounds.east &&
|
|
||||||
lng >= bounds.west;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanitize user data for response
|
// Sanitize user data for response
|
||||||
function sanitizeUser(user) {
|
function sanitizeUser(user) {
|
||||||
const { Password, password, ...safeUser } = user;
|
const { Password, password, ...safeUser } = user;
|
||||||
|
|||||||
@ -265,16 +265,20 @@ create_locations_table() {
|
|||||||
"title": "latitude",
|
"title": "latitude",
|
||||||
"uidt": "Decimal",
|
"uidt": "Decimal",
|
||||||
"rqd": false,
|
"rqd": false,
|
||||||
"precision": 10,
|
"meta": {
|
||||||
|
"precision": 8,
|
||||||
"scale": 8
|
"scale": 8
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"column_name": "longitude",
|
"column_name": "longitude",
|
||||||
"title": "longitude",
|
"title": "longitude",
|
||||||
"uidt": "Decimal",
|
"uidt": "Decimal",
|
||||||
"rqd": false,
|
"rqd": false,
|
||||||
"precision": 11,
|
"meta": {
|
||||||
|
"precision": 8,
|
||||||
"scale": 8
|
"scale": 8
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"column_name": "first_name",
|
"column_name": "first_name",
|
||||||
@ -486,16 +490,20 @@ create_settings_table() {
|
|||||||
"title": "latitude",
|
"title": "latitude",
|
||||||
"uidt": "Decimal",
|
"uidt": "Decimal",
|
||||||
"rqd": false,
|
"rqd": false,
|
||||||
"precision": 10,
|
"meta": {
|
||||||
|
"precision": 8,
|
||||||
"scale": 8
|
"scale": 8
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"column_name": "longitude",
|
"column_name": "longitude",
|
||||||
"title": "longitude",
|
"title": "longitude",
|
||||||
"uidt": "Decimal",
|
"uidt": "Decimal",
|
||||||
"rqd": false,
|
"rqd": false,
|
||||||
"precision": 11,
|
"meta": {
|
||||||
|
"precision": 8,
|
||||||
"scale": 8
|
"scale": 8
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"column_name": "zoom",
|
"column_name": "zoom",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user