📄 shputils.c
字号:
/****************************************************************************** * $Id: shputils.c,v 1.6 2001/08/28 13:57:14 warmerda Exp $ * * Project: Shapelib * Purpose: * Altered "shpdump" and "dbfdump" to allow two files to be appended. * Other Functions: * Selecting from the DBF before the write occurs. * Change the UNITS between Feet and Meters and Shift X,Y. * Clip and Erase boundary. The program only passes thru the * data once. * * Bill Miller North Carolina - Department of Transporation * Feb. 1997 -- bmiller@dot.state.nc.us * There was not a lot of time to debug hidden problems; * And the code is not very well organized or documented. * The clip/erase function was not well tested. * Oct. 2000 -- bmiller@dot.state.nc.us * Fixed the problem when select is using numbers * larger than short integer. It now reads long integer. * NOTE: DBF files created using windows NT will read as a string with * a length of 381 characters. This is a bug in "dbfopen". * * * Author: Bill Miller (bmiller@dot.state.nc.us) * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shputils.c,v $ * Revision 1.6 2001/08/28 13:57:14 warmerda * fixed DBFAddField return value check * * Revision 1.5 2000/11/02 13:52:48 warmerda * major upgrade from Bill Miller * * Revision 1.4 1999/11/05 14:12:05 warmerda * updated license terms * * Revision 1.3 1998/12/03 15:47:39 warmerda * Did a bunch of rewriting to make it work with the V1.2 API. * * Revision 1.2 1998/06/18 01:19:49 warmerda * Made C++ compilable. * * Revision 1.1 1997/05/27 20:40:27 warmerda * Initial revision */static char rcsid[] = "$Id: shputils.c,v 1.6 2001/08/28 13:57:14 warmerda Exp $";#include "shapefil.h"#include "string.h"#ifndef FALSE# define FALSE 0# define TRUE 1#endifchar infile[80], outfile[80], temp[400];/* Variables for shape files */SHPHandle hSHP;SHPHandle hSHPappend;int nShapeType, nEntities, iPart;int nShapeTypeAppend, nEntitiesAppend;SHPObject *psCShape;double adfBoundsMin[4], adfBoundsMax[4];/* Variables for DBF files */DBFHandle hDBF;DBFHandle hDBFappend; DBFFieldType iType;DBFFieldType jType; char iszTitle[12];char jszTitle[12];int *pt;char iszFormat[32], iszField[1024];char jszFormat[32], jszField[1024];int i, ti, iWidth, iDecimals, iRecord;int j, tj, jWidth, jDecimals, jRecord;int found, newdbf;void openfiles(void);void setext(char *pt, char *ext);int strncasecmp2(char *s1, char *s2, int n);void mergefields(void);void findselect(void);void showitems(void);int selectrec();int check_theme_bnd();int clip_boundary();void error();/* -------------------------------------------------------------------- *//* Variables for the DESCRIBE function *//* -------------------------------------------------------------------- */ int ilist = FALSE, iall = FALSE;/* -------------------------------------------------------------------- *//* Variables for the SELECT function *//* -------------------------------------------------------------------- */ int found = FALSE, newdbf = FALSE; char selectitem[40], *cpt; long int selectvalues[150], selcount=0; int iselect = FALSE, iselectitem = -1; int iunselect = FALSE;/* -------------------------------------------------------------------- *//* Variables for the CLIP and ERASE functions *//* -------------------------------------------------------------------- */ double cxmin, cymin, cxmax, cymax; int iclip = FALSE, ierase = FALSE; int itouch = FALSE, iinside = FALSE, icut = FALSE; int ibound = FALSE, ipoly = FALSE; char clipfile[80];/* -------------------------------------------------------------------- *//* Variables for the FACTOR function *//* -------------------------------------------------------------------- */ double infactor,outfactor,factor = 0; /* NO FACTOR */ int iunit = FALSE; int ifactor = FALSE; /* -------------------------------------------------------------------- *//* Variables for the SHIFT function *//* -------------------------------------------------------------------- */ double xshift = 0, yshift = 0; /* NO SHIFT */ int main( int argc, char ** argv ){/* -------------------------------------------------------------------- *//* Check command line usage. *//* -------------------------------------------------------------------- */ if( argc < 2 ) error(); strcpy(infile, argv[1]); if (argc > 2) { strcpy(outfile,argv[2]); if (strncasecmp2(outfile, "LIST",0) == 0) { ilist = TRUE; } if (strncasecmp2(outfile, "ALL",0) == 0) { iall = TRUE; } } if (ilist || iall || argc == 2 ) { setext(infile, "shp"); printf("DESCRIBE: %s\n",infile); strcpy(outfile,""); }/* -------------------------------------------------------------------- *//* Look for other functions on the command line. (SELECT, UNIT) *//* -------------------------------------------------------------------- */ for (i = 3; i < argc; i++) { if ((strncasecmp2(argv[i], "SEL",3) == 0) || (strncasecmp2(argv[i], "UNSEL",5) == 0)) { if (strncasecmp2(argv[i], "UNSEL",5) == 0) iunselect=TRUE; i++; if (i >= argc) error(); strcpy(selectitem,argv[i]); i++; if (i >= argc) error(); selcount=0; strcpy(temp,argv[i]); cpt=temp; tj = atoi(cpt); ti = 0; while (tj>0) { selectvalues[selcount] = tj; while( *cpt >= '0' && *cpt <= '9') cpt++; while( *cpt > '\0' && (*cpt < '0' || *cpt > '9') ) cpt++; tj=atoi(cpt); selcount++; } iselect=TRUE; } /*** End SEL & UNSEL ***/ else if ((strncasecmp2(argv[i], "CLIP",4) == 0) || (strncasecmp2(argv[i], "ERASE",5) == 0)) { if (strncasecmp2(argv[i], "ERASE",5) == 0) ierase=TRUE; i++; if (i >= argc) error(); strcpy(clipfile,argv[i]); sscanf(argv[i],"%lf",&cxmin); i++; if (i >= argc) error(); if (strncasecmp2(argv[i], "BOUND",5) == 0) { setext(clipfile, "shp"); hSHP = SHPOpen( clipfile, "rb" ); if( hSHP == NULL ) { printf( "ERROR: Unable to open the clip shape file:%s\n", clipfile ); exit( 1 ); } SHPGetInfo( hSHPappend, NULL, NULL, adfBoundsMin, adfBoundsMax ); cxmin = adfBoundsMin[0]; cymin = adfBoundsMin[1]; cxmax = adfBoundsMax[0]; cymax = adfBoundsMax[1]; printf("Theme Clip Boundary: (%lf,%lf) - (%lf,%lf)\n", cxmin, cymin, cxmax, cymax); ibound=TRUE; } else { /*** xmin,ymin,xmax,ymax ***/ sscanf(argv[i],"%lf",&cymin); i++; if (i >= argc) error(); sscanf(argv[i],"%lf",&cxmax); i++; if (i >= argc) error(); sscanf(argv[i],"%lf",&cymax); printf("Clip Box: (%lf,%lf) - (%lf,%lf)\n",cxmin, cymin, cxmax, cymax); } i++; if (i >= argc) error(); if (strncasecmp2(argv[i], "CUT",3) == 0) icut=TRUE; else if (strncasecmp2(argv[i], "TOUCH",5) == 0) itouch=TRUE; else if (strncasecmp2(argv[i], "INSIDE",6) == 0) iinside=TRUE; else error(); iclip=TRUE; } /*** End CLIP & ERASE ***/ else if (strncasecmp2(argv[i], "FACTOR",0) == 0) { i++; if (i >= argc) error(); infactor=findunit(argv[i]); if (infactor == 0) error(); iunit=TRUE; i++; if (i >= argc) error(); outfactor=findunit(argv[i]); if (outfactor == 0) { sscanf(argv[i],"%lf",&factor); if (factor == 0) error(); } if (factor == 0) { if (infactor ==0) { puts("ERROR: Input unit must be defined before output unit"); exit(); } factor=infactor/outfactor; } printf("Output file coordinate values will be factored by %lg\n",factor); ifactor=(factor != 1); /* True if a valid factor */ } /*** End FACTOR ***/ else if (strncasecmp2(argv[i],"SHIFT",5) == 0) { i++; if (i >= argc) error(); sscanf(argv[i],"%lf",&xshift); i++; if (i >= argc) error(); sscanf(argv[i],"%lf",&yshift); iunit=TRUE; printf("X Shift: %lg Y Shift: %lg\n",xshift,yshift); } /*** End SHIFT ***/ else { printf("ERROR: Unknown function %s\n",argv[i]); error(); } }/* -------------------------------------------------------------------- *//* If there is no data in this file let the user know. *//* -------------------------------------------------------------------- */ openfiles(); /* Open the infile and the outfile for shape and dbf. */ if( DBFGetFieldCount(hDBF) == 0 ) { puts( "There are no fields in this table!" ); exit( 1 ); }/* -------------------------------------------------------------------- *//* Print out the file bounds. *//* -------------------------------------------------------------------- */ iRecord = DBFGetRecordCount( hDBF ); SHPGetInfo( hSHP, NULL, NULL, adfBoundsMin, adfBoundsMax ); printf( "Input Bounds: (%lg,%lg) - (%lg,%lg) Entities: %d DBF: %d\n", adfBoundsMin[0], adfBoundsMin[1], adfBoundsMax[0], adfBoundsMax[1], nEntities, iRecord ); if (strcmp(outfile,"") == 0) /* Describe the shapefile; No other functions */ { ti = DBFGetFieldCount( hDBF ); showitems(); exit(0); } if (iclip) check_theme_bnd(); jRecord = DBFGetRecordCount( hDBFappend ); SHPGetInfo( hSHPappend, NULL, NULL, adfBoundsMin, adfBoundsMax ); if (nEntitiesAppend == 0) puts("New Output File\n"); else printf( "Append Bounds: (%lg,%lg)-(%lg,%lg) Entities: %d DBF: %d\n", adfBoundsMin[0], adfBoundsMin[1], adfBoundsMax[0], adfBoundsMax[1], nEntitiesAppend, jRecord ); /* -------------------------------------------------------------------- *//* Find matching fields in the append file or add new items. *//* -------------------------------------------------------------------- */ mergefields();/* -------------------------------------------------------------------- *//* Find selection field if needed. *//* -------------------------------------------------------------------- */ if (iselect) findselect();/* -------------------------------------------------------------------- *//* Read all the records *//* -------------------------------------------------------------------- */ jRecord = DBFGetRecordCount( hDBFappend ); for( iRecord = 0; iRecord < nEntities; iRecord++) /** DBFGetRecordCount(hDBF) **/ {/* -------------------------------------------------------------------- *//* SELECT for values if needed. (Can the record be skipped.) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -