From 933bb6c9254ba4761eb960c1b3893a9e57c39fb6 Mon Sep 17 00:00:00 2001 From: Bibiko Date: Thu, 7 Oct 2010 22:23:29 +0000 Subject: =?UTF-8?q?=E2=80=A2=20enhanced=20spatial=20support=20-=20implemen?= =?UTF-8?q?ted=20native=20routine=20to=20immediate=20AsText()=20[MULTIPOLY?= =?UTF-8?q?GON=20and=20GEOMETRYCOLLECTION=20are=20not=20yet=20ready]=20-?= =?UTF-8?q?=20enabled=20editing=20of=20spatial=20data=20in=20Content=20Vie?= =?UTF-8?q?w=20for=20tables=20and=20views=20and=20in=20Custom=20Query=20vi?= =?UTF-8?q?a=20wkt=20strings=20which=20will=20be=20saved=20automatically?= =?UTF-8?q?=20as=20wkb=20by=20using=20GeomFromText()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MCPKit/MCPFoundationKit/MCPGeometryData.h | 25 +++- .../MCPKit/MCPFoundationKit/MCPGeometryData.m | 126 ++++++++++++++++++++- Frameworks/MCPKit/MCPFoundationKit/MCPResult.m | 2 +- .../MCPKit/MCPFoundationKit/MCPStreamingResult.m | 2 +- 4 files changed, 145 insertions(+), 10 deletions(-) (limited to 'Frameworks/MCPKit') diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h index 60a7febf..c37e286d 100644 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h +++ b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h @@ -25,15 +25,34 @@ #import #import +enum wkbType +{ + wkb_point = 1, + wkb_linestring = 2, + wkb_polygon = 3, + wkb_multipoint = 4, + wkb_multilinestring = 5, + wkb_multipolygon = 6, + wkb_geometrycollection = 7 +}; + +typedef struct st_point_2d_ +{ + double x; + double y; +} st_point_2d; + @interface MCPGeometryData : NSObject { - char *geoBuffer; + Byte *geoBuffer; NSUInteger bufferLength; } -- (id)initWithData:(NSData*)geoData; -+ (id)dataWithData:(NSData*)geoData; +- (id)initWithBytes:(Byte*)geoData length:(NSUInteger)length; ++ (id)dataWithBytes:(Byte*)geoData length:(NSUInteger)length; - (NSString*)description; - (NSUInteger)length; +- (NSData*)data; +- (NSString*)wktString; @end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m index 9f7ac19a..6a41e657 100644 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m +++ b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m @@ -25,6 +25,11 @@ #import "MCPGeometryData.h" +#define SIZEOF_STORED_UINT32 4 +#define SIZEOF_STORED_DOUBLE 8 +#define POINT_DATA_SIZE (SIZEOF_STORED_DOUBLE*2) +#define WKB_HEADER_SIZE (1+SIZEOF_STORED_UINT32) + @implementation MCPGeometryData - (id)copyWithZone:(NSZone *)zone { return [self retain]; } @@ -38,20 +43,20 @@ return self; } -- (id)initWithData:(NSData*)geoData +- (id)initWithBytes:(Byte*)geoData length:(NSUInteger)length { if ((self = [self init])) { - bufferLength = [geoData length]; + bufferLength = length; geoBuffer = malloc(bufferLength); - memcpy(geoBuffer, [geoData bytes], bufferLength); + memcpy(geoBuffer, geoData, bufferLength); } return self; } -+ (id)dataWithData:(NSData*)geoData ++ (id)dataWithBytes:(Byte*)geoData length:(NSUInteger)length { - return [[[MCPGeometryData alloc] initWithData:geoData] autorelease]; + return [[[MCPGeometryData alloc] initWithBytes:geoData length:length] autorelease]; } - (NSString*)description @@ -64,6 +69,117 @@ return bufferLength; } +- (NSData*)data +{ + return [NSData dataWithBytes:geoBuffer length:bufferLength]; +} + +- (NSString*)wktString +{ + char byteOrder; + UInt32 geoType, c, c1; + st_point_2d aPoint; + NSUInteger ptr; + double x, y; + NSMutableString *wkt = [NSMutableString string]; + NSUInteger i,j; + BOOL raw = NO; + + if (bufferLength < WKB_HEADER_SIZE) + return @"Error"; + + ptr = (raw) ? 0 : 4; + + byteOrder = geoBuffer[ptr]; + + if(byteOrder != 0x1) + return @"Byte order not yet supported"; + + ptr++; + geoType = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + + NSData *d; + switch(geoType) { + case wkb_point: + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + return [NSString stringWithFormat:@"POINT(%.16g %.16g)",aPoint.x, aPoint.y]; + break; + case wkb_linestring: + [wkt setString:@"LINESTRING("]; + c = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + for(i=0; i