#ifdef STANDARD #include #include #include #else #include #include #include // To get strmov() #endif #include #include #include #include #define FIELD_NUMERO_INI_IZQ "INIIZQ" #define FIELD_NUMERO_INI_DER "INIDER" #define FIELD_NUMERO_TER_IZQ "TERIZQ" #define FIELD_NUMERO_TER_DER "TERDER" #define FIELD_NOMBRE "NOMBRE" #define FIELD_COMUNA "COMUNA" /******************* * * CREATE FUNCTION getDireccion RETURNS STRING SONAME "udf_gis.so"; * DROP FUNCTION getDireccion ********************/ typedef struct mapa_ { mapObj *objetoMapa; pointObj *punto; shapeObj shape; }mapa; int getMin(int iniIzq,int iniDer,int terDer, int terIzq) { int ini; if(iniIzq!=0) ini=iniIzq; else ini=iniDer; if(ini>terIzq && terIzq!=0) { ini=terIzq; } if(ini>iniDer && iniDer!=0) { ini=iniDer; } if(ini>terDer && terDer!=0) { ini=terDer; } return ini; } int getMax(int iniIzq,int iniDer,int terDer, int terIzq) { int ter; if(iniIzq!=0) ter=iniIzq; else ter=iniDer; if(terarg_count != 4) { strcpy(message,"getDirecccion takes 4 parameters."); return 1; } if(args->arg_type[0] !=REAL_RESULT) { strcpy(message,"Wrong parameter (1)."); return 1; } if(args->arg_type[1]!=REAL_RESULT) { strcpy(message,"Wrong parameter (2)."); return 1; } if(args->arg_type[2]!= STRING_RESULT) { strcpy(message,"Wrong parameter (3)."); return 1; } if(args->arg_type[3]!= STRING_RESULT) { strcpy(message,"Wrong parameter (4)."); return 1; } mapaPtr=(mapa *)malloc(sizeof(mapa)); initid->ptr=(char *)mapaPtr; return 0; } void getDireccion_deinit(UDF_INIT *initid) { if(initid->ptr) free(initid->ptr); } char *getDireccion(UDF_INIT *initid, UDF_ARGS *args, char *result,unsigned long *length, char *is_null, char *error) { mapa *mapaPtr= (mapa *)initid->ptr; double x,y; x = *((double*) args->args[0]); y = *((double*) args->args[1]); //strncpy(mapPath, args->args[2], args->lengths[2]); //strncpy(shapePath, args->args[3], args->lengths[3]); //static char result[1000]; //memset(result,0x0,1000); *length=0; int i; //mapObj *initid->ptr->objetoMapa; mapaPtr->objetoMapa= msLoadMap(args->args[2],NULL); if(mapaPtr->objetoMapa==NULL) { //printf("No existe mapa\n"); strcpy(result,"Can't load map."); //*length=(unsigned long)strlen(result); return NULL;//result; } //mapaPtr->objetoMapa->shapepath=args->args[3]; mapaPtr->objetoMapa->shapepath=(char *)malloc(sizeof(char)*1000); memset(mapaPtr->objetoMapa->shapepath,0x0,1000); strcpy(mapaPtr->objetoMapa->shapepath,args->args[3]); mapaPtr->objetoMapa->status = MS_ON; mapaPtr->objetoMapa->height=600; mapaPtr->objetoMapa->width=398; int layerIndex=msGetLayerIndex(mapaPtr->objetoMapa,"ZoneCities"); if(layerIndex==-1) { mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msFreeMap(mapaPtr->objetoMapa); strcpy(result,"Layer no existe"); msResetErrorList(); return NULL; //*length=(unsigned long)strlen(result); //return result; } int resultado=1; mapaPtr->objetoMapa->layers[layerIndex].status = MS_ON; mapaPtr->punto=(pointObj *)malloc(sizeof(pointObj)); mapaPtr->punto->x=x; mapaPtr->punto->y=y; resultado=msQueryByPoint(mapaPtr->objetoMapa,layerIndex,MS_SINGLE,*(mapaPtr->punto),800.0); // //printf("REsultado msQueryByPoint: %d\n", resultado); if(resultado!=0) { mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); strcpy(result,"Query by poit 1 failed"); msResetErrorList(); return NULL; //*length=(unsigned long)strlen(result); //return result; } //shapeObj shape; msInitShape(&mapaPtr->shape); resultado=msLayerOpen(&(mapaPtr->objetoMapa->layers[layerIndex])); //printf("REsultado msLayerOpen: %d\n", resultado); if(resultado!=0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); //strcpy(result,"Leyer Open 1 failed"); msResetErrorList(); return NULL; //*length=(unsigned long)strlen(result); //return result; } if(mapaPtr->objetoMapa->layers[layerIndex].resultcache->numresults==0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); //strcpy(result,"Results 1 null"); //*length=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } resultado=msLayerGetItems(&(mapaPtr->objetoMapa->layers[layerIndex])); //printf("REsultado msLayerGetItems: %d\n", resultado); if(resultado!=0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); //strcpy(result,"get Items 1 failed"); //*length=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } resultado=msLayerGetShape(&(mapaPtr->objetoMapa->layers[layerIndex]), &mapaPtr->shape, mapaPtr->objetoMapa->layers[layerIndex].resultcache->results[0].tileindex,mapaPtr->objetoMapa->layers[layerIndex].resultcache->results[0].shapeindex ); //printf("REsultado msLayerGetShape: %d\n", resultado); if(resultado!=0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); //strcpy(result,"get Shape 1 failed"); //*length=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } char zona[100]; int zonaNum=atoi(mapaPtr->shape.values[0]); memset(zona,0x0,100); strcpy(zona,mapaPtr->shape.values[2]); msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msQueryFree(mapaPtr->objetoMapa,layerIndex); ////////////////////////////////////////////////////////////CIUDAD///////////////////////////////////// layerIndex=msGetLayerIndex(mapaPtr->objetoMapa,zona); if(layerIndex==-1) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); //strcpy(result,"msGetLayerIndex 2 failed"); //*length=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } mapaPtr->objetoMapa->layers[layerIndex].status = MS_ON; resultado=msQueryByPoint(mapaPtr->objetoMapa,layerIndex,MS_SINGLE,*(mapaPtr->punto),500.0); //printf("REsultado msQueryByPoint: %d\n", resultado); if(resultado!=0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); msResetErrorList(); //strcpy(result,"msQueryByPoint 2 failed"); //(*length)=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } //shapeObj shape1; msInitShape(&mapaPtr->shape); resultado=msLayerOpen(&(mapaPtr->objetoMapa->layers[layerIndex])); //printf("REsultado msLayerOpen: %d\n", resultado); if(resultado!=0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); msResetErrorList(); //strcpy(result,"msLayerOpen 2 failed"); //*length=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } if(mapaPtr->objetoMapa->layers[layerIndex].resultcache->numresults==0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); msResetErrorList(); //strcpy(result,"numresults null 2 failed"); //*length=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } resultado=msLayerGetItems(&(mapaPtr->objetoMapa->layers[layerIndex])); //printf("REsultado msLayerGetItems: %d\n", resultado); if(resultado!=0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); msResetErrorList(); //strcpy(result,"msLayerGetItems 2 failed"); //*length=(unsigned long)strlen(result); //return result; msResetErrorList(); return NULL; } resultado=msLayerGetShape(&(mapaPtr->objetoMapa->layers[layerIndex]), &mapaPtr->shape, mapaPtr->objetoMapa->layers[layerIndex].resultcache->results[0].tileindex,mapaPtr->objetoMapa->layers[layerIndex].resultcache->results[0].shapeindex ); //printf("REsultado msLayerGetShape: %d\n", resultado); if(resultado!=0) { msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); //strcpy(result,"msLayerGetShape 2 failed"); msResetErrorList(); return NULL; //*length=(unsigned long)strlen(result); //return result; } int iniIzq=0;//atoi(shape1.values[10]);//10 int terIzq=0;//atoi(shape1.values[11]); int iniDer=0;//atoi(shape1.values[12]); int terDer=0;//atoi(shape1.values[12]); char nombre[255]; memset(nombre,0x0,255); char comuna[255]; memset(comuna,0x0,255); for(i=0;ishape.numvalues;i++) { if(strcmp(mapaPtr->objetoMapa->layers[layerIndex].items[i],FIELD_NOMBRE) ==0) strcpy(nombre,mapaPtr->shape.values[i]); else if(strcmp(mapaPtr->objetoMapa->layers[layerIndex].items[i],FIELD_COMUNA) ==0) strcpy(comuna,mapaPtr->shape.values[i]); else if(strcmp(mapaPtr->objetoMapa->layers[layerIndex].items[i],FIELD_NUMERO_INI_IZQ) ==0) iniIzq=atoi(mapaPtr->shape.values[i]); else if(strcmp(mapaPtr->objetoMapa->layers[layerIndex].items[i],FIELD_NUMERO_INI_DER) ==0) iniDer=atoi(mapaPtr->shape.values[i]); else if(strcmp(mapaPtr->objetoMapa->layers[layerIndex].items[i],FIELD_NUMERO_TER_IZQ) ==0) terIzq=atoi(mapaPtr->shape.values[i]); else if(strcmp(mapaPtr->objetoMapa->layers[layerIndex].items[i],FIELD_NUMERO_TER_DER) ==0) terDer=atoi(mapaPtr->shape.values[i]); } double largo=0; double tmp=msDistancePointToShape(mapaPtr->punto,&mapaPtr->shape); double segmento=0; int indice=0; for(i=0;ishape.line[0].numpoints-1;i++) { double distanciaTmp=msDistancePointToPoint(&(mapaPtr->shape.line[0].point[i]),&(mapaPtr->shape.line[0].point[i+1])); if(msDistancePointToSegment(mapaPtr->punto,&(mapaPtr->shape.line[0].point[i]),&(mapaPtr->shape.line[0].point[i+1]))-tmp<0.001) { indice=i; segmento=largo; } largo+=distanciaTmp; } double tmp2=msDistancePointToPoint(&(mapaPtr->shape.line[0].point[indice]),mapaPtr->punto); segmento+=sqrt(tmp2*tmp2-tmp*tmp); int numero=getNumero(iniIzq, iniDer, terDer, terIzq, segmento,largo); if(zonaNum==3) { sprintf(result,"%s KM %d,%s",nombre,numero,comuna); } else { sprintf(result,"%s Nš %d,%s",nombre,numero,comuna); } msFreeShape(&mapaPtr->shape); mapaPtr->objetoMapa->layers[layerIndex].status = MS_OFF; msLayerClose(&(mapaPtr->objetoMapa->layers[layerIndex])); msFree(mapaPtr->punto); msQueryFree(mapaPtr->objetoMapa,layerIndex); msFreeMap(mapaPtr->objetoMapa); msResetErrorList(); //return result; (*length)=(unsigned long)strlen(result); return result; } #endif /* HAVE_DLOPEN */