瀏覽代碼

add support for us survey foot, https://trac.osgeo.org/grass/ticket/2417

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@62060 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 10 年之前
父節點
當前提交
4d786676e1
共有 4 個文件被更改,包括 34 次插入5 次删除
  1. 1 0
      include/gis.h
  2. 2 1
      lib/gis/proj2.c
  3. 5 2
      lib/gis/proj3.c
  4. 26 2
      lib/gis/units.c

+ 1 - 0
include/gis.h

@@ -74,6 +74,7 @@ static const char *GRASS_copyright __attribute__ ((unused))
 #define U_FEET		6
 #define U_RADIANS	7
 #define U_DEGREES	8
+#define U_USFEET	9
 /* Temporal units from the datetime library */
 #define U_YEARS         DATETIME_YEAR   
 #define U_MONTHS        DATETIME_MONTH  

+ 2 - 1
lib/gis/proj2.c

@@ -23,6 +23,7 @@
    - U_UNKNOWN (XY)
    - U_METERS  (UTM)
    - U_FEET    (SP)
+   - U_USFEET (a few SP)
    - U_DEGREES (LL)
    
   \return units code (see gis.h)
@@ -36,7 +37,7 @@ int G__projection_units(int n)
     case PROJECTION_UTM:
 	return U_METERS;
     case PROJECTION_SP:
-	return U_FEET;
+	return U_FEET; /* TODO: what if U_USFEET as in CA and NC ? */
     case PROJECTION_LL:
 	return U_DEGREES;
     default:

+ 5 - 2
lib/gis/proj3.c

@@ -73,6 +73,8 @@ const char *G_database_unit_name(int plural)
 	    units = U_MILES;
 	else if (strcasecmp(name, "foot") == 0 || strcasecmp(name, "feet") == 0)
 	    units = U_FEET;
+	else if (strcasecmp(name, "foot_us") == 0 || strcasecmp(name, "foot_uss") == 0)
+	    units = U_USFEET;
 	else if (strcasecmp(name, "degree") == 0 || strcasecmp(name, "degrees") == 0)
 	    units = U_DEGREES;
 	else
@@ -127,7 +129,7 @@ double G_database_units_to_meters_factor(void)
     double factor;
     int n;
 
-    /* TODO: note the definitions in ../proj/units.table */
+    /* TODO: sync with definitions in ../proj/units.table */
     static const struct
     {
 	char *unit;
@@ -135,7 +137,8 @@ double G_database_units_to_meters_factor(void)
     } table[] = {
 	{"unit",  1.0},
 	{"meter", 1.0},
-	{"foot", .3048},
+	{"foot",  .3048},
+	{"foot_us", 1200/3937.},
 	{"inch", .0254},
 	{NULL, 0.0}
     };

+ 26 - 2
lib/gis/units.c

@@ -26,6 +26,7 @@
    - U_KILOMETERS
    - U_MILES
    - U_FEET
+   - U_USFEET
 
   Returns a factor which converts meters to units (by multiplication).
  
@@ -52,6 +53,10 @@ double G_meters_to_units_factor(int units)
 	return 3.28083989501312;	        /*  1 / (0.0254 * 12)    */
 	break;
 	
+    case U_USFEET:
+	return 3.28083333333333;       	        /*  1 / (1200/3937)    */
+	break;
+	
     default:
 	return 1.0;
 	break;
@@ -70,6 +75,7 @@ double G_meters_to_units_factor(int units)
    - U_HECTARES
    - U_MILES
    - U_FEET
+   - U_USFEET
 
   Returns a factor which converts square meters to square units (by
   multiplication).
@@ -102,7 +108,11 @@ double G_meters_to_units_factor_sq(int units)
 	break;
 	
     case U_FEET:
-	return 10.7639104167097;	        /*  1 / (0.0254 * 12)^2  */
+	return 10.7639104167097;	/*  1 / (0.0254 * 12)^2  */
+	break;
+	
+    case U_USFEET:
+	return 10.7638673611111;       	/*  1 / (1200/3937)^2    */
 	break;
 	
     default:
@@ -135,6 +145,8 @@ int G_is_units_type_spatial(int units)
         return 1;
     case U_FEET:
         return 1;
+    case U_USFEET:
+        return 1;
     case U_RADIANS:
         return 1;
     case U_DEGREES:
@@ -179,6 +191,7 @@ int G_is_units_type_temporal(int units)
    - U_HECTARES
    - U_MILES
    - U_FEET
+   - U_USFEET
 
   \param units units code
   \param plural plural form if true
@@ -241,6 +254,13 @@ const char *G_get_units_name(int units, int plural, int square)
 	    return plural ? _("feet") : _("foot");
 	break;
 
+    case U_USFEET:
+	if (square)
+	    return plural ? _("square US feet") : _("square US foot");
+	else
+	    return plural ? _("US feet") : _("US foot");
+	break;
+
     case U_DEGREES:
 	if (square)
 	    return plural ? _("square degrees") : _("square degree");
@@ -286,6 +306,7 @@ const char *G_get_units_name(int units, int plural, int square)
    - U_HECTARES
    - U_MILES
    - U_FEET
+   - U_USFEET
    - ...
    - U_YEARS
    - ...
@@ -319,11 +340,14 @@ int G_units(const char *units_name)
     else if (strcasecmp(units_name, "foot") == 0 ||
 	     strcasecmp(units_name, "feet") == 0)
 	return U_FEET;
+    else if (strcasecmp(units_name, "foot_us") == 0 ||
+	     strcasecmp(units_name, "foot_uss") == 0)
+	return U_USFEET;
     else if (strcasecmp(units_name, "degree") == 0 ||
 	     strcasecmp(units_name, "degrees") == 0)
 	return U_DEGREES;
     else if (strcasecmp(units_name, "year") == 0 ||
-	strcasecmp(units_name, "years") == 0)
+	     strcasecmp(units_name, "years") == 0)
 	return U_YEARS;
     else if (strcasecmp(units_name, "month") == 0 ||
 	     strcasecmp(units_name, "months") == 0)