- Timestamp:
- Jun 27, 2014, 1:43:56 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/zoo-project/zoo-services/ogr/base-vect-ops/service.c
r348 r491 26 26 #include "ogr_api.h" 27 27 #include "ogr_geometry.h" 28 29 #include "cpl_minixml.h" 30 #include "ogr_api.h" 31 #include "ogrsf_frmts.h" 32 28 33 #include "geos_c.h" 29 34 #include "service.h" … … 44 49 void printExceptionReportResponse(maps*,map*); 45 50 char *base64(const char *input, int length); 46 int errorException(maps *m, const char *message, const char *errorcode);47 51 48 52 OGRGeometryH createGeometryFromGML(maps* conf,char* inputStr){ … … 53 57 xmlXPathContextPtr xpathCtx; 54 58 xmlXPathObjectPtr xpathObj; 55 c har * xpathExpr="/*/*/*/*/*[local-name()='Polygon' or local-name()='MultiPolygon']";59 const char * xpathExpr="/*/*/*/*/*[local-name()='Polygon' or local-name()='MultiPolygon']"; 56 60 xpathCtx = xmlXPathNewContext(doc); 57 61 xpathObj = xmlXPathEvalExpression(BAD_CAST xpathExpr,xpathCtx); … … 179 183 180 184 181 int applyOne(maps*& conf,maps*& inputs,maps*& outputs,OGRGeometryH (*myFunc)(OGRGeometryH),char* schema){ 182 #ifdef DEBUG 183 fprintf(stderr,"\nService internal print\n"); 184 #endif 185 int applyOne(maps*& conf,maps*& inputs,maps*& outputs,OGRGeometry* (OGRGeometry::*myFunc)() const,const char* schema){ 186 OGRRegisterAll(); 187 185 188 maps* cursor=inputs; 186 189 OGRGeometryH geometry,res; 187 #ifdef DEBUG 188 dumpMaps(cursor);189 #endif 190 OGRLayer *poDstLayer; 191 const char *oDriver1; 192 OGRDataSource *poODS; 190 193 map* tmp=getMapFromMaps(inputs,"InputPolygon","value"); 191 194 if(!tmp){ … … 193 196 return SERVICE_FAILED; 194 197 } 195 #ifdef DEBUG 196 fprintf(stderr,"Service internal print \n"); 197 dumpMaps(inputs); 198 fprintf(stderr,"/Service internal print \n"); 199 #endif 198 char filename[1024]; 200 199 map* tmp1=getMapFromMaps(inputs,"InputPolygon","mimeType"); 201 #ifdef DEBUG 202 fprintf(stderr,"Service internal print \n"); 203 dumpMap(tmp1); 204 fprintf(stderr,"/Service internal print \n"); 205 #endif 200 const char *oDriver; 201 oDriver="GeoJSON"; 202 sprintf(filename,"/vsimem/input_%d.json",getpid()); 206 203 if(tmp1!=NULL){ 207 if(strncmp(tmp1->value,"text/js",7)==0 || 208 strncmp(tmp1->value,"application/json",7)==0) 209 geometry=OGR_G_CreateGeometryFromJson(tmp->value); 210 else 211 geometry=createGeometryFromGML(conf,tmp->value); 204 if(strcmp(tmp1->value,"text/xml")==0){ 205 sprintf(filename,"/vsimem/input_%d.xml",getpid()); 206 oDriver="GML"; 207 } 208 } 209 VSILFILE *ifile=VSIFileFromMemBuffer(filename,(GByte*)tmp->value,strlen(tmp->value),FALSE); 210 VSIFCloseL(ifile); 211 OGRDataSource* ipoDS = OGRSFDriverRegistrar::Open(filename,FALSE); 212 char pszDestDataSource[100]; 213 if( ipoDS == NULL ) 214 { 215 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 216 217 fprintf( stderr, "FAILURE:\n" 218 "Unable to open datasource `%s' with the following drivers.\n", 219 filename ); 220 221 for( int iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 222 { 223 fprintf( stderr, " -> %s\n", poR->GetDriver(iDriver)->GetName() ); 224 } 225 char tmp[1024]; 226 sprintf(tmp,"Unable to open datasource `%s' with the following drivers.",filename); 227 setMapInMaps(conf,"lenv","message",tmp); 228 return SERVICE_FAILED; 229 } 230 for( int iLayer = 0; iLayer < ipoDS->GetLayerCount(); 231 iLayer++ ) 232 { 233 OGRLayer *poLayer = ipoDS->GetLayer(iLayer); 234 235 if( poLayer == NULL ) 236 { 237 fprintf( stderr, "FAILURE: Couldn't fetch advertised layer %d!\n", 238 iLayer ); 239 char tmp[1024]; 240 sprintf(tmp,"Couldn't fetch advertised layer %d!",iLayer); 241 setMapInMaps(conf,"lenv","message",tmp); 242 return SERVICE_FAILED; 243 } 244 245 OGRFeature *poFeature; 246 247 /* -------------------------------------------------------------------- */ 248 /* Try opening the output datasource as an existing, writable */ 249 /* -------------------------------------------------------------------- */ 250 251 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 252 OGRSFDriver *poDriver = NULL; 253 int iDriver; 254 255 map* tmpMap=getMapFromMaps(outputs,"Result","mimeType"); 256 oDriver1="GeoJSON"; 257 sprintf(pszDestDataSource,"/vsimem/result_%d.json",getpid()); 258 if(tmpMap!=NULL){ 259 if(strcmp(tmpMap->value,"text/xml")==0){ 260 sprintf(pszDestDataSource,"/vsimem/result_%d.xml",getpid()); 261 oDriver1="GML"; 262 } 263 } 264 265 for( iDriver = 0; 266 iDriver < poR->GetDriverCount() && poDriver == NULL; 267 iDriver++ ) 268 { 269 if( EQUAL(poR->GetDriver(iDriver)->GetName(),oDriver1) ) 270 { 271 poDriver = poR->GetDriver(iDriver); 272 } 273 } 274 275 if( poDriver == NULL ) 276 { 277 char emessage[8192]; 278 sprintf( emessage, "Unable to find driver `%s'.\n", oDriver ); 279 sprintf( emessage, "%sThe following drivers are available:\n",emessage ); 280 281 for( iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 282 { 283 sprintf( emessage, "%s -> `%s'\n", emessage, poR->GetDriver(iDriver)->GetName() ); 284 } 285 286 setMapInMaps(conf,"lenv","message",emessage); 287 return SERVICE_FAILED; 288 289 } 290 291 if( !poDriver->TestCapability( ODrCCreateDataSource ) ){ 292 char emessage[1024]; 293 sprintf( emessage, "%s driver does not support data source creation.\n", 294 "json" ); 295 setMapInMaps(conf,"lenv","message",emessage); 296 return SERVICE_FAILED; 297 } 298 299 /* -------------------------------------------------------------------- */ 300 /* Create the output data source. */ 301 /* -------------------------------------------------------------------- */ 302 //map* tpath=getMapFromMaps(conf,"main","tmpPath"); 303 char **papszDSCO=NULL; 304 poODS = poDriver->CreateDataSource( pszDestDataSource, papszDSCO ); 305 if( poODS == NULL ){ 306 char emessage[1024]; 307 sprintf( emessage, "%s driver failed to create %s\n", 308 "json", pszDestDataSource ); 309 setMapInMaps(conf,"lenv","message",emessage); 310 return SERVICE_FAILED; 311 } 312 313 /* -------------------------------------------------------------------- */ 314 /* Create the layer. */ 315 /* -------------------------------------------------------------------- */ 316 if( !poODS->TestCapability( ODsCCreateLayer ) ) 317 { 318 char emessage[1024]; 319 sprintf( emessage, 320 "Layer %s not found, and CreateLayer not supported by driver.", 321 "Result" ); 322 setMapInMaps(conf,"lenv","message",emessage); 323 return SERVICE_FAILED; 324 } 325 326 //CPLErrorReset(); 327 328 poDstLayer = poODS->CreateLayer( "Result", NULL,wkbUnknown,NULL); 329 if( poDstLayer == NULL ){ 330 setMapInMaps(conf,"lenv","message","Layer creation failed.\n"); 331 return SERVICE_FAILED; 332 } 333 334 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn(); 335 int iField; 336 int hasMmField=0; 337 338 for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ ) 339 { 340 OGRFieldDefn *tmp=poFDefn->GetFieldDefn(iField); 341 if (iField >= 0) 342 poDstLayer->CreateField( poFDefn->GetFieldDefn(iField) ); 343 else 344 { 345 fprintf( stderr, "Field '%s' not found in source layer.\n", 346 iField ); 347 return SERVICE_FAILED; 348 } 349 } 350 351 while(TRUE){ 352 OGRFeature *poDstFeature = NULL; 353 poFeature = poLayer->GetNextFeature(); 354 if( poFeature == NULL ) 355 break; 356 if(poFeature->GetGeometryRef() != NULL){ 357 // DO SOMETHING HERE !! 358 poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() ); 359 if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ) 360 { 361 char tmpMsg[1024]; 362 sprintf( tmpMsg,"Unable to translate feature %ld from layer %s.\n", 363 poFeature->GetFID(), poFDefn->GetName() ); 364 365 OGRFeature::DestroyFeature( poFeature ); 366 OGRFeature::DestroyFeature( poDstFeature ); 367 return SERVICE_FAILED; 368 } 369 if(poDstFeature->SetGeometryDirectly((poDstFeature->GetGeometryRef()->*myFunc)()) != OGRERR_NONE ) 370 { 371 char tmpMsg[1024]; 372 sprintf( tmpMsg,"Unable to translate feature %ld from layer %s.\n", 373 poFeature->GetFID(), poFDefn->GetName() ); 374 375 OGRFeature::DestroyFeature( poFeature ); 376 OGRFeature::DestroyFeature( poDstFeature ); 377 return SERVICE_FAILED; 378 } 379 OGRFeature::DestroyFeature( poFeature ); 380 if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE ) 381 { 382 OGRFeature::DestroyFeature( poDstFeature ); 383 return SERVICE_FAILED; 384 } 385 OGRFeature::DestroyFeature( poDstFeature ); 386 } 387 } 388 389 } 390 391 delete poODS; 392 delete ipoDS; 393 394 char *res1=readVSIFile(conf,pszDestDataSource); 395 if(res1==NULL) 396 return SERVICE_FAILED; 397 setMapInMaps(outputs,"Result","value",res1); 398 free(res1); 399 400 OGRCleanupAll(); 401 return SERVICE_SUCCEEDED; 402 } 403 404 #ifdef WIN32 405 __declspec(dllexport) 406 #endif 407 int Buffer(maps*& conf,maps*& inputs,maps*& outputs){ 408 OGRRegisterAll(); 409 410 double bufferDistance; 411 map* tmp0=getMapFromMaps(inputs,"BufferDistance","value"); 412 if(tmp0==NULL){ 413 bufferDistance=atof("10.0"); 212 414 } 213 415 else 214 geometry=createGeometryFromGML(conf,tmp->value); 215 if(geometry==NULL){ 416 bufferDistance=atof(tmp0->value); 417 418 maps* cursor=inputs; 419 OGRGeometryH geometry,res; 420 OGRLayer *poDstLayer; 421 const char *oDriver1; 422 OGRDataSource *poODS; 423 map* tmp=getMapFromMaps(inputs,"InputPolygon","value"); 424 if(!tmp){ 216 425 setMapInMaps(conf,"lenv","message",_ss("Unable to parse the input geometry from InputPolygon")); 217 426 return SERVICE_FAILED; 218 427 } 219 res=(*myFunc)(geometry); 428 char filename[1024]; 429 map* tmp1=getMapFromMaps(inputs,"InputPolygon","mimeType"); 430 const char *oDriver; 431 oDriver="GeoJSON"; 432 sprintf(filename,"/vsimem/input_%d.json",getpid()); 433 if(tmp1!=NULL){ 434 if(strcmp(tmp1->value,"text/xml")==0){ 435 sprintf(filename,"/vsimem/input_%d.xml",getpid()); 436 oDriver="GML"; 437 } 438 } 439 VSILFILE *ifile=VSIFileFromMemBuffer(filename,(GByte*)tmp->value,strlen(tmp->value),FALSE); 440 VSIFCloseL(ifile); 441 OGRDataSource* ipoDS = OGRSFDriverRegistrar::Open(filename,FALSE); 442 char pszDestDataSource[100]; 443 if( ipoDS == NULL ) 444 { 445 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 446 447 fprintf( stderr, "FAILURE:\n" 448 "Unable to open datasource `%s' with the following drivers.\n", 449 filename ); 450 451 for( int iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 452 { 453 fprintf( stderr, " -> %s\n", poR->GetDriver(iDriver)->GetName() ); 454 } 455 char tmp[1024]; 456 sprintf(tmp,"Unable to open datasource `%s' with the following drivers.",filename); 457 setMapInMaps(conf,"lenv","message",tmp); 458 return SERVICE_FAILED; 459 } 460 for( int iLayer = 0; iLayer < ipoDS->GetLayerCount(); 461 iLayer++ ) 462 { 463 OGRLayer *poLayer = ipoDS->GetLayer(iLayer); 464 465 if( poLayer == NULL ) 466 { 467 fprintf( stderr, "FAILURE: Couldn't fetch advertised layer %d!\n", 468 iLayer ); 469 char tmp[1024]; 470 sprintf(tmp,"Couldn't fetch advertised layer %d!",iLayer); 471 setMapInMaps(conf,"lenv","message",tmp); 472 return SERVICE_FAILED; 473 } 474 475 OGRFeature *poFeature; 476 477 /* -------------------------------------------------------------------- */ 478 /* Try opening the output datasource as an existing, writable */ 479 /* -------------------------------------------------------------------- */ 480 481 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 482 OGRSFDriver *poDriver = NULL; 483 int iDriver; 484 485 map* tmpMap=getMapFromMaps(outputs,"Result","mimeType"); 486 oDriver1="GeoJSON"; 487 sprintf(pszDestDataSource,"/vsimem/result_%d.json",getpid()); 488 if(tmpMap!=NULL){ 489 if(strcmp(tmpMap->value,"text/xml")==0){ 490 sprintf(pszDestDataSource,"/vsimem/result_%d.xml",getpid()); 491 oDriver1="GML"; 492 } 493 } 494 495 for( iDriver = 0; 496 iDriver < poR->GetDriverCount() && poDriver == NULL; 497 iDriver++ ) 498 { 499 if( EQUAL(poR->GetDriver(iDriver)->GetName(),oDriver1) ) 500 { 501 poDriver = poR->GetDriver(iDriver); 502 } 503 } 504 505 if( poDriver == NULL ) 506 { 507 char emessage[8192]; 508 sprintf( emessage, "Unable to find driver `%s'.\n", oDriver ); 509 sprintf( emessage, "%sThe following drivers are available:\n",emessage ); 510 511 for( iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 512 { 513 sprintf( emessage, "%s -> `%s'\n", emessage, poR->GetDriver(iDriver)->GetName() ); 514 } 515 516 setMapInMaps(conf,"lenv","message",emessage); 517 return SERVICE_FAILED; 518 519 } 520 521 if( !poDriver->TestCapability( ODrCCreateDataSource ) ){ 522 char emessage[1024]; 523 sprintf( emessage, "%s driver does not support data source creation.\n", 524 "json" ); 525 setMapInMaps(conf,"lenv","message",emessage); 526 return SERVICE_FAILED; 527 } 528 529 /* -------------------------------------------------------------------- */ 530 /* Create the output data source. */ 531 /* -------------------------------------------------------------------- */ 532 //map* tpath=getMapFromMaps(conf,"main","tmpPath"); 533 char **papszDSCO=NULL; 534 poODS = poDriver->CreateDataSource( pszDestDataSource, papszDSCO ); 535 if( poODS == NULL ){ 536 char emessage[1024]; 537 sprintf( emessage, "%s driver failed to create %s\n", 538 "json", pszDestDataSource ); 539 setMapInMaps(conf,"lenv","message",emessage); 540 return SERVICE_FAILED; 541 } 542 543 /* -------------------------------------------------------------------- */ 544 /* Create the layer. */ 545 /* -------------------------------------------------------------------- */ 546 if( !poODS->TestCapability( ODsCCreateLayer ) ) 547 { 548 char emessage[1024]; 549 sprintf( emessage, 550 "Layer %s not found, and CreateLayer not supported by driver.", 551 "Result" ); 552 setMapInMaps(conf,"lenv","message",emessage); 553 return SERVICE_FAILED; 554 } 555 556 //CPLErrorReset(); 557 558 poDstLayer = poODS->CreateLayer( "Result", NULL,wkbUnknown,NULL); 559 if( poDstLayer == NULL ){ 560 setMapInMaps(conf,"lenv","message","Layer creation failed.\n"); 561 return SERVICE_FAILED; 562 } 563 564 OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn(); 565 int iField; 566 int hasMmField=0; 567 568 for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ ) 569 { 570 OGRFieldDefn *tmp=poFDefn->GetFieldDefn(iField); 571 if (iField >= 0) 572 poDstLayer->CreateField( poFDefn->GetFieldDefn(iField) ); 573 else 574 { 575 fprintf( stderr, "Field '%s' not found in source layer.\n", 576 iField ); 577 return SERVICE_FAILED; 578 } 579 } 580 581 while(TRUE){ 582 OGRFeature *poDstFeature = NULL; 583 poFeature = poLayer->GetNextFeature(); 584 if( poFeature == NULL ) 585 break; 586 if(poFeature->GetGeometryRef() != NULL){ 587 // DO SOMETHING HERE !! 588 poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() ); 589 if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ) 590 { 591 char tmpMsg[1024]; 592 sprintf( tmpMsg,"Unable to translate feature %ld from layer %s.\n", 593 poFeature->GetFID(), poFDefn->GetName() ); 594 595 OGRFeature::DestroyFeature( poFeature ); 596 OGRFeature::DestroyFeature( poDstFeature ); 597 return SERVICE_FAILED; 598 } 599 if(poDstFeature->SetGeometryDirectly(poDstFeature->GetGeometryRef()->Buffer(bufferDistance,30)) != OGRERR_NONE ) 600 { 601 char tmpMsg[1024]; 602 sprintf( tmpMsg,"Unable to translate feature %ld from layer %s.\n", 603 poFeature->GetFID(), poFDefn->GetName() ); 604 605 OGRFeature::DestroyFeature( poFeature ); 606 OGRFeature::DestroyFeature( poDstFeature ); 607 return SERVICE_FAILED; 608 } 609 OGRFeature::DestroyFeature( poFeature ); 610 if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE ) 611 { 612 OGRFeature::DestroyFeature( poDstFeature ); 613 return SERVICE_FAILED; 614 } 615 OGRFeature::DestroyFeature( poDstFeature ); 616 } 617 } 618 619 } 620 621 delete poODS; 622 delete ipoDS; 623 624 char *res1=readVSIFile(conf,pszDestDataSource); 625 if(res1==NULL) 626 return SERVICE_FAILED; 627 setMapInMaps(outputs,"Result","value",res1); 628 free(res1); 629 630 OGRCleanupAll(); 631 return SERVICE_SUCCEEDED; 632 633 } 634 635 #ifdef WIN32 636 __declspec(dllexport) 637 #endif 638 int Boundary(maps*& conf,maps*& inputs,maps*& outputs){ 639 return applyOne(conf,inputs,outputs,&OGRGeometry::Boundary,"http://fooa/gml/3.1.0/polygon.xsd"); 640 } 641 642 #ifdef WIN32 643 __declspec(dllexport) 644 #endif 645 int ConvexHull(maps*& conf,maps*& inputs,maps*& outputs){ 646 return applyOne(conf,inputs,outputs,&OGRGeometry::ConvexHull,"http://fooa/gml/3.1.0/polygon.xsd"); 647 } 648 649 650 OGRDataSource* loadEntity(maps* conf,maps* inputs,char **filename,const char **oDriver,const char *entity,int iter){ 651 map* tmp=getMapFromMaps(inputs,entity,"value"); 652 map* tmp1=getMapFromMaps(inputs,entity,"mimeType"); 653 *oDriver="GeoJSON"; 654 sprintf(*filename,"/vsimem/input_%d.json",getpid()+iter); 655 if(tmp1!=NULL){ 656 if(strcmp(tmp1->value,"text/xml")==0){ 657 sprintf(*filename,"/vsimem/input_%d.xml",getpid()+iter); 658 *oDriver="GML"; 659 } 660 } 661 VSILFILE *ifile=VSIFileFromMemBuffer(*filename,(GByte*)tmp->value,strlen(tmp->value),FALSE); 662 VSIFCloseL(ifile); 663 return OGRSFDriverRegistrar::Open(*filename,FALSE); 664 } 665 666 int applyOneBool(maps*& conf,maps*& inputs,maps*& outputs,OGRBoolean (OGRGeometry::*myFunc)() const){ 220 667 #ifdef DEBUG 221 fprintf(stderr,"Service internal print \n"); 222 dumpMaps(outputs); 223 fprintf(stderr,"/Service internal print \n"); 224 #endif 225 map *tmp_2=getMapFromMaps(outputs,"Result","mimeType"); 668 fprintf(stderr,"\nService internal print\n"); 669 #endif 670 OGRRegisterAll(); 671 672 maps* cursor=inputs; 673 OGRGeometryH geometry,res; 674 OGRLayer *poDstLayer; 675 const char *oDriver1; 676 OGRDataSource *poODS; 226 677 #ifdef DEBUG 227 fprintf(stderr,"Service internal print \n"); 228 dumpMap(tmp_2); 229 fprintf(stderr,"/Service internal print \n"); 230 #endif 231 if(tmp_2!=NULL){ 232 if(strncmp(tmp_2->value,"text/js",7)==0 || 233 strncmp(tmp_2->value,"application/json",16)==0){ 234 char *tmpS=OGR_G_ExportToJson(res); 235 setMapInMaps(outputs,"Result","value",tmpS); 236 #ifndef WIN32 237 setMapInMaps(outputs,"Result","mimeType","text/plain"); 238 setMapInMaps(outputs,"Result","encoding","UTF-8"); 239 free(tmpS); 240 #endif 241 } 242 else{ 243 char *tmpS=OGR_G_ExportToGML(res); 244 setMapInMaps(outputs,"Result","value",tmpS); 245 #ifndef WIN32 246 setMapInMaps(outputs,"Result","mimeType","text/xml"); 247 setMapInMaps(outputs,"Result","encoding","UTF-8"); 248 setMapInMaps(outputs,"Result","schema",schema); 249 free(tmpS); 250 #endif 251 } 252 }else{ 253 char *tmpS=OGR_G_ExportToJson(res); 254 setMapInMaps(outputs,"Result","value",tmpS); 255 #ifndef WIN32 256 setMapInMaps(outputs,"Result","mimeType","text/plain"); 257 setMapInMaps(outputs,"Result","encoding","UTF-8"); 258 free(tmpS); 259 #endif 260 } 261 //outputs->next=NULL; 678 dumpMaps(cursor); 679 #endif 680 map* tmp=getMapFromMaps(inputs,"InputPolygon","value"); 681 if(!tmp){ 682 setMapInMaps(conf,"lenv","message",_ss("Unable to parse the input geometry from InputPolygon")); 683 return SERVICE_FAILED; 684 } 685 char filename[1024]; 686 map* tmp1=getMapFromMaps(inputs,"InputPolygon","mimeType"); 687 const char *oDriver; 688 oDriver="GeoJSON"; 689 sprintf(filename,"/vsimem/input_%d.json",getpid()); 690 if(tmp1!=NULL){ 691 if(strcmp(tmp1->value,"text/xml")==0){ 692 sprintf(filename,"/vsimem/input_%d.xml",getpid()); 693 oDriver="GML"; 694 } 695 } 696 VSILFILE *ifile=VSIFileFromMemBuffer(filename,(GByte*)tmp->value,strlen(tmp->value),FALSE); 697 VSIFCloseL(ifile); 698 OGRDataSource* ipoDS = OGRSFDriverRegistrar::Open(filename,FALSE); 699 char pszDestDataSource[100]; 700 if( ipoDS == NULL ) 701 { 702 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 703 704 fprintf( stderr, "FAILURE:\n" 705 "Unable to open datasource `%s' with the following drivers.\n", 706 filename ); 707 708 for( int iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 709 { 710 fprintf( stderr, " -> %s\n", poR->GetDriver(iDriver)->GetName() ); 711 } 712 char tmp[1024]; 713 sprintf(tmp,"Unable to open datasource `%s' with the following drivers.",filename); 714 setMapInMaps(conf,"lenv","message",tmp); 715 return SERVICE_FAILED; 716 } 717 for( int iLayer = 0; iLayer < ipoDS->GetLayerCount(); 718 iLayer++ ) 719 { 720 OGRLayer *poLayer = ipoDS->GetLayer(iLayer); 721 722 if( poLayer == NULL ) 723 { 724 fprintf( stderr, "FAILURE: Couldn't fetch advertised layer %d!\n", 725 iLayer ); 726 char tmp[1024]; 727 sprintf(tmp,"Couldn't fetch advertised layer %d!",iLayer); 728 setMapInMaps(conf,"lenv","message",tmp); 729 return SERVICE_FAILED; 730 } 731 732 OGRFeature *poFeature; 733 734 735 while(TRUE){ 736 OGRFeature *poDstFeature = NULL; 737 poFeature = poLayer->GetNextFeature(); 738 if( poFeature == NULL ) 739 break; 740 if(poFeature->GetGeometryRef() != NULL){ 741 // DO SOMETHING HERE !! 742 if((poFeature->GetGeometryRef()->*myFunc)()==0){ 743 setMapInMaps(outputs,"Result","value","false"); 744 OGRFeature::DestroyFeature( poFeature ); 745 delete ipoDS; 746 return SERVICE_SUCCEEDED; 747 } 748 } 749 OGRFeature::DestroyFeature( poFeature ); 750 } 751 752 } 753 754 delete ipoDS; 755 setMapInMaps(outputs,"Result","value","true"); 756 757 OGRCleanupAll(); 758 return SERVICE_SUCCEEDED; 759 } 760 761 #ifdef WIN32 762 __declspec(dllexport) 763 #endif 764 int IsSimple(maps*& conf,maps*& inputs,maps*& outputs){ 765 return applyOneBool(conf,inputs,outputs,&OGRGeometry::IsSimple); 766 } 767 768 #ifdef WIN32 769 __declspec(dllexport) 770 #endif 771 int IsClosed(maps*& conf,maps*& inputs,maps*& outputs){ 772 return applyOneBool(conf,inputs,outputs,&OGRGeometry::IsRing); 773 } 774 775 #ifdef WIN32 776 __declspec(dllexport) 777 #endif 778 int IsValid(maps*& conf,maps*& inputs,maps*& outputs){ 779 return applyOneBool(conf,inputs,outputs,&OGRGeometry::IsValid); 780 } 781 782 783 int applyTwo(maps*& conf,maps*& inputs,maps*& outputs,OGRGeometry* (OGRGeometry::*myFunc)(const OGRGeometry*) const){ 262 784 #ifdef DEBUG 263 dumpMaps(outputs); 264 fprintf(stderr,"\nService internal print\n===\n"); 265 #endif 266 OGR_G_DestroyGeometry(res); 267 OGR_G_DestroyGeometry(geometry); 268 //CPLFree(res); 269 //CPLFree(geometry); 785 fprintf(stderr,"\nService internal print\n"); 786 #endif 787 OGRRegisterAll(); 788 789 maps* cursor=inputs; 790 OGRGeometryH geometry,res; 791 OGRLayer *poDstLayer; 792 //const char *oDriver1; 793 OGRDataSource *poODS; 270 794 #ifdef DEBUG 271 fprintf(stderr,"Service internal print \n"); 272 dumpMaps(outputs); 273 fprintf(stderr,"/Service internal print \n"); 274 #endif 795 dumpMaps(cursor); 796 #endif 797 798 char *filename=(char*)malloc(1024*sizeof(char)); 799 const char *oDriver1; 800 OGRDataSource* ipoDS1 = loadEntity(conf,inputs,&filename,&oDriver1,"InputEntity1",1); 801 802 char *filename1=(char*)malloc(1024*sizeof(char)); 803 const char *oDriver2; 804 OGRDataSource* ipoDS2 = loadEntity(conf,inputs,&filename1,&oDriver2,"InputEntity2",2); 805 const char *oDriver3; 806 char pszDestDataSource[100]; 807 if( ipoDS1 == NULL || ipoDS2 == NULL ) 808 { 809 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 810 811 fprintf( stderr, "FAILURE:\n" 812 "Unable to open datasource `%s' with the following drivers.\n", 813 filename ); 814 815 for( int iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 816 { 817 fprintf( stderr, " -> %s\n", poR->GetDriver(iDriver)->GetName() ); 818 } 819 char tmp[1024]; 820 if( ipoDS1 == NULL ) 821 sprintf(tmp,"Unable to open datasource `%s' with the following drivers.",filename); 822 if( ipoDS2 == NULL ) 823 sprintf(tmp,"Unable to open datasource `%s' with the following drivers.",filename1); 824 setMapInMaps(conf,"lenv","message",tmp); 825 return SERVICE_FAILED; 826 } 827 for( int iLayer = 0; iLayer < ipoDS1->GetLayerCount(); 828 iLayer++ ) 829 { 830 OGRLayer *poLayer1 = ipoDS1->GetLayer(iLayer); 831 832 if( poLayer1 == NULL ) 833 { 834 fprintf( stderr, "FAILURE: Couldn't fetch advertised layer %d!\n", 835 iLayer ); 836 char tmp[1024]; 837 sprintf(tmp,"Couldn't fetch advertised layer %d!",iLayer); 838 setMapInMaps(conf,"lenv","message",tmp); 839 return SERVICE_FAILED; 840 } 841 842 for( int iLayer1 = 0; iLayer1 < ipoDS2->GetLayerCount(); 843 iLayer1++ ) 844 { 845 OGRLayer *poLayer2 = ipoDS2->GetLayer(iLayer1); 846 847 if( poLayer1 == NULL ) 848 { 849 fprintf( stderr, "FAILURE: Couldn't fetch advertised layer %d!\n", 850 iLayer1 ); 851 char tmp[1024]; 852 sprintf(tmp,"Couldn't fetch advertised layer %d!",iLayer1); 853 setMapInMaps(conf,"lenv","message",tmp); 854 return SERVICE_FAILED; 855 } 856 857 OGRFeature *poFeature1,*poFeature2; 858 859 /* -------------------------------------------------------------------- */ 860 /* Try opening the output datasource as an existing, writable */ 861 /* -------------------------------------------------------------------- */ 862 863 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 864 OGRSFDriver *poDriver = NULL; 865 int iDriver; 866 867 map* tmpMap=getMapFromMaps(outputs,"Result","mimeType"); 868 oDriver3="GeoJSON"; 869 sprintf(pszDestDataSource,"/vsimem/result_%d.json",getpid()); 870 if(tmpMap!=NULL){ 871 if(strcmp(tmpMap->value,"text/xml")==0){ 872 sprintf(pszDestDataSource,"/vsimem/result_%d.xml",getpid()); 873 oDriver3="GML"; 874 } 875 } 876 877 for( iDriver = 0; 878 iDriver < poR->GetDriverCount() && poDriver == NULL; 879 iDriver++ ) 880 { 881 #ifdef DEBUG 882 fprintf(stderr,"D:%s\n",poR->GetDriver(iDriver)->GetName()); 883 #endif 884 if( EQUAL(poR->GetDriver(iDriver)->GetName(),oDriver3) ) 885 { 886 poDriver = poR->GetDriver(iDriver); 887 } 888 } 889 890 if( poDriver == NULL ) 891 { 892 char emessage[8192]; 893 sprintf( emessage, "Unable to find driver `%s'.\n", oDriver1 ); 894 sprintf( emessage, "%sThe following drivers are available:\n",emessage ); 895 896 for( iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 897 { 898 sprintf( emessage, "%s -> `%s'\n", emessage, poR->GetDriver(iDriver)->GetName() ); 899 } 900 901 setMapInMaps(conf,"lenv","message",emessage); 902 return SERVICE_FAILED; 903 904 } 905 906 if( !poDriver->TestCapability( ODrCCreateDataSource ) ){ 907 char emessage[1024]; 908 sprintf( emessage, "%s driver does not support data source creation.\n", 909 "json" ); 910 setMapInMaps(conf,"lenv","message",emessage); 911 return SERVICE_FAILED; 912 } 913 914 /* -------------------------------------------------------------------- */ 915 /* Create the output data source. */ 916 /* -------------------------------------------------------------------- */ 917 //map* tpath=getMapFromMaps(conf,"main","tmpPath"); 918 char **papszDSCO=NULL; 919 poODS = poDriver->CreateDataSource( pszDestDataSource, papszDSCO ); 920 if( poODS == NULL ){ 921 char emessage[1024]; 922 sprintf( emessage, "%s driver failed to create %s\n", 923 "json", pszDestDataSource ); 924 setMapInMaps(conf,"lenv","message",emessage); 925 return SERVICE_FAILED; 926 } 927 928 /* -------------------------------------------------------------------- */ 929 /* Create the layer. */ 930 /* -------------------------------------------------------------------- */ 931 if( !poODS->TestCapability( ODsCCreateLayer ) ) 932 { 933 char emessage[1024]; 934 sprintf( emessage, 935 "Layer %s not found, and CreateLayer not supported by driver.", 936 "Result" ); 937 setMapInMaps(conf,"lenv","message",emessage); 938 return SERVICE_FAILED; 939 } 940 941 //CPLErrorReset(); 942 943 poDstLayer = poODS->CreateLayer( "Result", NULL,wkbUnknown,NULL); 944 if( poDstLayer == NULL ){ 945 setMapInMaps(conf,"lenv","message","Layer creation failed.\n"); 946 return SERVICE_FAILED; 947 } 948 949 OGRFeatureDefn *poFDefn = poLayer1->GetLayerDefn(); 950 int iField; 951 int hasMmField=0; 952 953 for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ ) 954 { 955 OGRFieldDefn *tmp=poFDefn->GetFieldDefn(iField); 956 if (iField >= 0) 957 poDstLayer->CreateField( poFDefn->GetFieldDefn(iField) ); 958 else 959 { 960 fprintf( stderr, "Field '%s' not found in source layer.\n", 961 iField ); 962 return SERVICE_FAILED; 963 } 964 } 965 966 while(TRUE){ 967 OGRFeature *poDstFeature = NULL; 968 poFeature1 = poLayer1->GetNextFeature(); 969 if( poFeature1 == NULL ) 970 break; 971 while(TRUE){ 972 poFeature2 = poLayer2->GetNextFeature(); 973 if( poFeature2 == NULL ) 974 break; 975 976 if(poFeature1->GetGeometryRef() != NULL && poFeature2->GetGeometryRef() != NULL){ 977 // DO SOMETHING HERE !! 978 poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() ); 979 if( poDstFeature->SetFrom( poFeature2, TRUE ) != OGRERR_NONE ) 980 { 981 char tmpMsg[1024]; 982 sprintf( tmpMsg,"Unable to translate feature %ld from layer %s.\n", 983 poFeature2->GetFID(), poFDefn->GetName() ); 984 985 OGRFeature::DestroyFeature( poFeature1 ); 986 OGRFeature::DestroyFeature( poFeature2 ); 987 OGRFeature::DestroyFeature( poDstFeature ); 988 return SERVICE_FAILED; 989 } 990 if(poDstFeature->SetGeometryDirectly((poFeature1->GetGeometryRef()->*myFunc)(poFeature2->GetGeometryRef())) != OGRERR_NONE ) 991 { 992 char tmpMsg[1024]; 993 sprintf( tmpMsg,"Unable to translate feature %ld from layer %s.\n", 994 poFeature2->GetFID(), poFDefn->GetName() ); 995 996 OGRFeature::DestroyFeature( poFeature1 ); 997 OGRFeature::DestroyFeature( poFeature2 ); 998 OGRFeature::DestroyFeature( poDstFeature ); 999 return SERVICE_FAILED; 1000 } 1001 OGRFeature::DestroyFeature( poFeature1 ); 1002 OGRFeature::DestroyFeature( poFeature2 ); 1003 if(!poDstFeature->GetGeometryRef()->IsEmpty()) 1004 if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE ) 1005 { 1006 OGRFeature::DestroyFeature( poDstFeature ); 1007 return SERVICE_FAILED; 1008 } 1009 OGRFeature::DestroyFeature( poDstFeature ); 1010 } 1011 } 1012 } 1013 } 1014 } 1015 1016 delete poODS; 1017 delete ipoDS1; 1018 delete ipoDS2; 1019 free(filename); 1020 free(filename1); 1021 1022 char *res1=readVSIFile(conf,pszDestDataSource); 1023 if(res1==NULL) 1024 return SERVICE_FAILED; 1025 setMapInMaps(outputs,"Result","value",res1); 1026 free(res1); 1027 OGRCleanupAll(); 275 1028 return SERVICE_SUCCEEDED; 276 1029 } 277 278 #ifdef WIN32 279 __declspec(dllexport) 280 #endif 281 int Buffer(maps*& conf,maps*& inputs,maps*& outputs){ 282 OGRGeometryH geometry,res; 283 map* tmp=getMapFromMaps(inputs,"InputPolygon","value"); 284 if(tmp==NULL){ 285 setMapInMaps(conf,"lenv","message",_ss("Unable to fetch input geometry")); 286 return SERVICE_FAILED; 287 }else 288 if(strlen(tmp->value)<=0){ 289 setMapInMaps(conf,"lenv","message",_ss("Unable to fetch input geometry")); 290 return SERVICE_FAILED; 291 } 292 map* tmp1=getMapFromMaps(inputs,"InputPolygon","mimeType"); 293 if(strncmp(tmp1->value,"application/json",16)==0) 294 geometry=OGR_G_CreateGeometryFromJson(tmp->value); 295 else 296 geometry=createGeometryFromGML(conf,tmp->value); 297 if(geometry==NULL){ 298 setMapInMaps(conf,"lenv","message",_ss("Unable to parse input geometry")); 299 return SERVICE_FAILED; 300 } 301 double bufferDistance; 302 tmp=getMapFromMaps(inputs,"BufferDistance","value"); 303 if(tmp==NULL){ 304 bufferDistance=atof("10.0"); 305 } 306 else 307 bufferDistance=atof(tmp->value); 308 res=OGR_G_Buffer(geometry,bufferDistance,30); 309 dumpMap(tmp); 310 tmp1=getMapFromMaps(outputs,"Result","mimeType"); 311 dumpMap(tmp); 312 if(strncmp(tmp1->value,"application/json",16)==0){ 313 char *tmpS=OGR_G_ExportToJson(res); 314 setMapInMaps(outputs,"Result","value",tmpS); 315 dumpMap(tmp); 316 #ifndef WIN32 317 setMapInMaps(outputs,"Result","mimeType","text/plain"); 318 setMapInMaps(outputs,"Result","encoding","UTF-8"); 319 free(tmpS); 320 #endif 321 } 322 else{ 323 char *tmpS=OGR_G_ExportToGML(res); 324 setMapInMaps(outputs,"Result","value",tmpS); 325 dumpMap(tmp); 326 #ifndef WIN32 327 free(tmpS); 328 setMapInMaps(outputs,"Result","mimeType","text/xml"); 329 setMapInMaps(outputs,"Result","encoding","UTF-8"); 330 setMapInMaps(outputs,"Result","schema","http://fooa/gml/3.1.0/polygon.xsd"); 331 #endif 332 } 333 //outputs->next=NULL; 334 OGR_G_DestroyGeometry(geometry); 335 OGR_G_DestroyGeometry(res); 336 return SERVICE_SUCCEEDED; 337 } 338 339 #ifdef WIN32 340 __declspec(dllexport) 341 #endif 342 int Boundary(maps*& conf,maps*& inputs,maps*& outputs){ 343 return applyOne(conf,inputs,outputs,&OGR_G_GetBoundary,"http://fooa/gml/3.1.0/polygon.xsd"); 344 } 345 346 #ifdef WIN32 347 __declspec(dllexport) 348 #endif 349 int ConvexHull(maps*& conf,maps*& inputs,maps*& outputs){ 350 return applyOne(conf,inputs,outputs,&OGR_G_ConvexHull,"http://fooa/gml/3.1.0/polygon.xsd"); 351 } 352 353 354 OGRGeometryH MY_OGR_G_Centroid(OGRGeometryH hTarget){ 355 OGRGeometryH res; 356 res=OGR_G_CreateGeometryFromJson("{\"type\": \"Point\", \"coordinates\": [0,0] }"); 357 OGRwkbGeometryType gtype=OGR_G_GetGeometryType(hTarget); 358 if(gtype!=wkbPolygon){ 359 hTarget=OGR_G_ConvexHull(hTarget); 360 } 361 int c=OGR_G_Centroid(hTarget,res); 362 return res; 363 } 364 365 #ifdef WIN32 366 __declspec(dllexport) 367 #endif 368 int Centroid(maps*& conf,maps*& inputs,maps*& outputs){ 369 return applyOne(conf,inputs,outputs,&MY_OGR_G_Centroid,"http://fooa/gml/3.1.0/point.xsd"); 370 } 371 372 int applyTwo(maps*& conf,maps*& inputs,maps*& outputs,OGRGeometryH (*myFunc)(OGRGeometryH,OGRGeometryH)){ 373 #ifdef DEBUG 374 fprintf(stderr,"\nService internal print1\n"); 375 fflush(stderr); 376 fprintf(stderr,"\nService internal print1\n"); 377 dumpMaps(inputs); 378 fprintf(stderr,"\nService internal print1\n"); 379 #endif 1030 1031 #ifdef WIN32 1032 __declspec(dllexport) 1033 #endif 1034 int Difference(maps*& conf,maps*& inputs,maps*& outputs){ 1035 return applyTwo(conf,inputs,outputs,&OGRGeometry::Difference); 1036 } 1037 1038 #ifdef WIN32 1039 __declspec(dllexport) 1040 #endif 1041 int SymDifference(maps*& conf,maps*& inputs,maps*& outputs){ 1042 return applyTwo(conf,inputs,outputs,&OGRGeometry::SymDifference); 1043 } 1044 1045 #ifdef WIN32 1046 __declspec(dllexport) 1047 #endif 1048 int Intersection(maps*& conf,maps*& inputs,maps*& outputs){ 1049 return applyTwo(conf,inputs,outputs,&OGRGeometry::Intersection); 1050 } 1051 1052 #ifdef WIN32 1053 __declspec(dllexport) 1054 #endif 1055 int Union(maps*& conf,maps*& inputs,maps*& outputs){ 1056 return applyTwo(conf,inputs,outputs,&OGRGeometry::Union); 1057 } 1058 1059 int applyTwoBool(maps*& conf,maps*& inputs,maps*& outputs,OGRBoolean (OGRGeometry::*myFunc)(const OGRGeometry*) const){ 1060 OGRRegisterAll(); 380 1061 381 1062 maps* cursor=inputs; 382 OGRGeometryH geometry 1,geometry2;383 OGR GeometryH res;384 {385 map* tmp=getMapFromMaps(inputs,"InputEntity1","value"); 386 map* tmp1=getMapFromMaps(inputs,"InputEntity1","mimeType");387 if(tmp1!=NULL){388 if(strncmp(tmp1->value,"application/json",16)==0)389 geometry1=OGR_G_CreateGeometryFromJson(tmp->value); 390 else 391 geometry1=createGeometryFromGML(conf,tmp->value);392 }393 else394 geometry1=createGeometryFromGML(conf,tmp->value);395 }396 if(geometry1==NULL){397 setMapInMaps(conf,"lenv","message",_ss("Unable to parse input geometry for InputEntity1."));398 #ifdef DEBUG 399 fprintf(stderr,"SERVICE FAILED !\n"); 400 #endif 401 return SERVICE_FAILED;402 } 403 #ifdef DEBUG 404 fprintf(stderr,"\nService internal print1 InputEntity1\n"); 405 #endif 406 { 407 map* tmp=getMapFromMaps(inputs,"InputEntity2","value");408 map* tmp1=getMapFromMaps(inputs,"InputEntity2","mimeType"); 409 #ifdef DEBUG 410 fprintf(stderr,"MY MAP \n[%s] - %i\n",tmp1->value,strncmp(tmp1->value,"application/json",16)); 411 //dumpMap(tmp);412 fprintf(stderr,"MY MAP\n");413 fprintf(stderr,"\nService internal print1 InputEntity2\n");414 #endif 415 if(tmp1!=NULL){416 if(strncmp(tmp1->value,"application/json",16)==0){ 417 #ifdef DEBUG 418 fprintf(stderr,"\nService internal print1 InputEntity2 as JSON\n");419 #endif 420 geometry2=OGR_G_CreateGeometryFromJson(tmp->value); 421 }422 else{423 #ifdef DEBUG 424 fprintf(stderr,"\nService internal print1 InputEntity2 as GML\n");425 #endif 426 geometry2=createGeometryFromGML(conf,tmp->value);427 }428 429 else 430 geometry2=createGeometryFromGML(conf,tmp->value);431 #ifdef DEBUG 432 fprintf(stderr,"\nService internal print1 InputEntity2 PreFinal\n"); 433 #endif 434 } 435 #ifdef DEBUG 436 fprintf(stderr,"\nService internal print1 InputEntity2 Final\n"); 437 #endif 438 if(geometry2==NULL){ 439 setMapInMaps(conf,"lenv","message",_ss("Unable to parse input geometry for InputEntity2."));440 #ifdef DEBUG 441 fprintf(stderr,"SERVICE FAILED !\n");442 #endif 443 return SERVICE_FAILED; 444 } 445 #ifdef DEBUG 446 fprintf(stderr,"\nService internal print1\n"); 447 #endif 448 res=(*myFunc)(geometry1,geometry2); 449 #ifdef DEBUG 450 fprintf(stderr,"\nService internal print1\n");451 #endif 452 /* nuova parte */ 453 map* tmp2=getMapFromMaps(outputs,"Result","mimeType"); 454 if(strncmp(tmp2->value,"application/json",16)==0){ 455 char *tmpS=OGR_G_ExportToJson(res); 456 setMapInMaps(outputs,"Result","value",tmpS);457 #ifndef WIN32 458 setMapInMaps(outputs,"Result","mimeType","text/plain"); 459 setMapInMaps(outputs,"Result","encoding","UTF-8"); 460 free(tmpS);461 #endif 462 } 463 else{ 464 char *tmpS=OGR_G_ExportToGML(res);465 setMapInMaps(outputs,"Result","value",tmpS);466 #ifndef WIN32 467 setMapInMaps(outputs,"Result","mimeType","text/xml");468 setMapInMaps(outputs,"Result","encoding","UTF-8"); 469 setMapInMaps(outputs,"Result","schema","http://fooa/gml/3.1.0/polygon.xsd"); 470 free(tmpS);471 #endif 472 } 473 474 /* vecchia da togliere */ 475 /*476 char *tmpS=OGR_G_ExportToJson(res); 477 setMapInMaps(outputs,"Result","value",tmpS);478 setMapInMaps(outputs,"Result","mimeType","text/plain");479 setMapInMaps(outputs,"Result","encoding","UTF-8");480 free( tmpS);481 */ 482 OGR_G_DestroyGeometry(geometry1);483 OGR_G_DestroyGeometry(geometry2); 484 OGR _G_DestroyGeometry(res);1063 OGRGeometryH geometry,res; 1064 OGRLayer *poDstLayer; 1065 OGRDataSource *poODS; 1066 1067 char *filename=(char*)malloc(1024*sizeof(char)); 1068 const char *oDriver1; 1069 OGRDataSource* ipoDS1 = loadEntity(conf,inputs,&filename,&oDriver1,"InputEntity1",1); 1070 1071 char *filename1=(char*)malloc(1024*sizeof(char)); 1072 const char *oDriver2; 1073 OGRDataSource* ipoDS2 = loadEntity(conf,inputs,&filename1,&oDriver2,"InputEntity2",2); 1074 const char *oDriver3; 1075 char pszDestDataSource[100]; 1076 if( ipoDS1 == NULL || ipoDS2 == NULL ) 1077 { 1078 OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); 1079 1080 fprintf( stderr, "FAILURE:\n" 1081 "Unable to open datasource `%s' with the following drivers.\n", 1082 filename ); 1083 1084 for( int iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) 1085 { 1086 fprintf( stderr, " -> %s\n", poR->GetDriver(iDriver)->GetName() ); 1087 } 1088 char tmp[1024]; 1089 if( ipoDS1 == NULL ) 1090 sprintf(tmp,"Unable to open datasource `%s' with the following drivers.",filename); 1091 if( ipoDS2 == NULL ) 1092 sprintf(tmp,"Unable to open datasource `%s' with the following drivers.",filename1); 1093 setMapInMaps(conf,"lenv","message",tmp); 1094 return SERVICE_FAILED; 1095 } 1096 for( int iLayer = 0; iLayer < ipoDS1->GetLayerCount(); 1097 iLayer++ ) 1098 { 1099 OGRLayer *poLayer1 = ipoDS1->GetLayer(iLayer); 1100 1101 if( poLayer1 == NULL ) 1102 { 1103 fprintf( stderr, "FAILURE: Couldn't fetch advertised layer %d!\n", 1104 iLayer ); 1105 char tmp[1024]; 1106 sprintf(tmp,"Couldn't fetch advertised layer %d!",iLayer); 1107 setMapInMaps(conf,"lenv","message",tmp); 1108 return SERVICE_FAILED; 1109 } 1110 1111 for( int iLayer1 = 0; iLayer1 < ipoDS2->GetLayerCount(); 1112 iLayer1++ ) 1113 { 1114 OGRLayer *poLayer2 = ipoDS2->GetLayer(iLayer1); 1115 1116 if( poLayer1 == NULL ) 1117 { 1118 fprintf( stderr, "FAILURE: Couldn't fetch advertised layer %d!\n", 1119 iLayer1 ); 1120 char tmp[1024]; 1121 sprintf(tmp,"Couldn't fetch advertised layer %d!",iLayer1); 1122 setMapInMaps(conf,"lenv","message",tmp); 1123 return SERVICE_FAILED; 1124 } 1125 1126 OGRFeature *poFeature1,*poFeature2; 1127 1128 1129 while(TRUE){ 1130 OGRFeature *poDstFeature = NULL; 1131 poFeature1 = poLayer1->GetNextFeature(); 1132 if( poFeature1 == NULL ) 1133 break; 1134 while(TRUE){ 1135 poFeature2 = poLayer2->GetNextFeature(); 1136 if( poFeature2 == NULL ) 1137 break; 1138 if(poFeature1->GetGeometryRef() != NULL && poFeature2->GetGeometryRef() != NULL){ 1139 // DO SOMETHING HERE !! 1140 if((poFeature1->GetGeometryRef()->*myFunc)(poFeature2->GetGeometryRef())==0){ 1141 setMapInMaps(outputs,"Result","value","false"); 1142 OGRFeature::DestroyFeature( poFeature1 ); 1143 OGRFeature::DestroyFeature( poFeature2 ); 1144 delete ipoDS1; 1145 delete ipoDS2; 1146 free(filename); 1147 free(filename1); 1148 return SERVICE_SUCCEEDED; 1149 } 1150 } 1151 OGRFeature::DestroyFeature( poFeature2 ); 1152 } 1153 OGRFeature::DestroyFeature( poFeature1 ); 1154 } 1155 } 1156 } 1157 1158 delete ipoDS1; 1159 delete ipoDS2; 1160 free(filename); 1161 free(filename1); 1162 1163 setMapInMaps(outputs,"Result","value","true"); 1164 1165 OGRCleanupAll(); 485 1166 return SERVICE_SUCCEEDED; 486 1167 } 487 488 #ifdef WIN32 489 __declspec(dllexport) 490 #endif 491 int Difference(maps*& conf,maps*& inputs,maps*& outputs){ 492 return applyTwo(conf,inputs,outputs,&OGR_G_Difference); 493 } 494 495 #ifdef WIN32 496 __declspec(dllexport) 497 #endif 498 int SymDifference(maps*& conf,maps*& inputs,maps*& outputs){ 499 return applyTwo(conf,inputs,outputs,&OGR_G_SymmetricDifference); 500 } 501 502 #ifdef WIN32 503 __declspec(dllexport) 504 #endif 505 int Intersection(maps*& conf,maps*& inputs,maps*& outputs){ 506 return applyTwo(conf,inputs,outputs,&OGR_G_Intersection); 507 } 508 509 #ifdef WIN32 510 __declspec(dllexport) 511 #endif 512 int Union(maps*& conf,maps*& inputs,maps*& outputs){ 513 return applyTwo(conf,inputs,outputs,&OGR_G_Union); 1168 1169 1170 #ifdef WIN32 1171 __declspec(dllexport) 1172 #endif 1173 int Equals(maps*& conf,maps*& inputs,maps*& outputs){ 1174 return applyTwoBool(conf,inputs,outputs,(OGRBoolean (OGRGeometry::*)(const OGRGeometry *) const)&OGRGeometry::Equals); 1175 } 1176 1177 #ifdef WIN32 1178 __declspec(dllexport) 1179 #endif 1180 int Disjoint(maps*& conf,maps*& inputs,maps*& outputs){ 1181 return applyTwoBool(conf,inputs,outputs,&OGRGeometry::Disjoint); 1182 } 1183 1184 #ifdef WIN32 1185 __declspec(dllexport) 1186 #endif 1187 int Touches(maps*& conf,maps*& inputs,maps*& outputs){ 1188 return applyTwoBool(conf,inputs,outputs,&OGRGeometry::Touches); 1189 } 1190 1191 #ifdef WIN32 1192 __declspec(dllexport) 1193 #endif 1194 int Crosses(maps*& conf,maps*& inputs,maps*& outputs){ 1195 return applyTwoBool(conf,inputs,outputs,&OGRGeometry::Crosses); 1196 } 1197 1198 #ifdef WIN32 1199 __declspec(dllexport) 1200 #endif 1201 int Within(maps*& conf,maps*& inputs,maps*& outputs){ 1202 return applyTwoBool(conf,inputs,outputs,&OGRGeometry::Within); 1203 } 1204 1205 #ifdef WIN32 1206 __declspec(dllexport) 1207 #endif 1208 int Contains(maps*& conf,maps*& inputs,maps*& outputs){ 1209 return applyTwoBool(conf,inputs,outputs,&OGRGeometry::Contains); 1210 } 1211 1212 #ifdef WIN32 1213 __declspec(dllexport) 1214 #endif 1215 int Overlaps(maps*& conf,maps*& inputs,maps*& outputs){ 1216 return applyTwoBool(conf,inputs,outputs,&OGRGeometry::Overlaps); 1217 } 1218 1219 #ifdef WIN32 1220 __declspec(dllexport) 1221 #endif 1222 int Intersects(maps*& conf,maps*& inputs,maps*& outputs){ 1223 return applyTwoBool(conf,inputs,outputs,(OGRBoolean (OGRGeometry::*)(const OGRGeometry *) const)&OGRGeometry::Intersects); 514 1224 } 515 1225 … … 605 1315 } 606 1316 fprintf(stderr,"geometry created %s \n",tmp->value); 607 res=OGR_G_ GetArea(geometry);1317 res=OGR_G_Area(geometry); 608 1318 fprintf(stderr,"area %d \n",res); 609 1319 /**
Note: See TracChangeset
for help on using the changeset viewer.