aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/MCPKit/MCPFoundationKit
diff options
context:
space:
mode:
authorBibiko <bibiko@eva.mpg.de>2010-10-08 19:57:21 +0000
committerBibiko <bibiko@eva.mpg.de>2010-10-08 19:57:21 +0000
commit8b4c46a01eab8f390ff4ab8ec5b78d8055ff4f34 (patch)
tree4a50ee43cccab449686c08d6626ccf4015086ae5 /Frameworks/MCPKit/MCPFoundationKit
parentdeea4b3347eed9d145bffcb0baf75544f99b6f14 (diff)
downloadsequelpro-8b4c46a01eab8f390ff4ab8ec5b78d8055ff4f34.tar.gz
sequelpro-8b4c46a01eab8f390ff4ab8ec5b78d8055ff4f34.tar.bz2
sequelpro-8b4c46a01eab8f390ff4ab8ec5b78d8055ff4f34.zip
• some further work on displaying geometry fields as image
- to enable the very first approach simply uncomment code in SPTableContent tableView:toolTipForCell:rect:tableColumn:row:mouseLocation: for MCPGeometryData class
Diffstat (limited to 'Frameworks/MCPKit/MCPFoundationKit')
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h1
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m298
2 files changed, 299 insertions, 0 deletions
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h
index 7d141991..cca59b30 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h
@@ -58,6 +58,7 @@ typedef struct st_point_2d_
- (NSUInteger)length;
- (NSData*)data;
- (NSString*)wktString;
+- (NSDictionary*)coordinates;
- (NSInteger)wkbType;
- (NSString*)wktType;
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m
index 1c511af3..b46a0dc7 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m
@@ -352,6 +352,304 @@
}
/**
+ * Return a dictionary of coordinates, bbox, etc. to be able to draw the given geometry.
+ *
+ * @return A dictionary having the following keys: "bbox" as NSArray of NSNumbers of x_min x_max y_min y_max, "coordinates" as NSArray containing the
+ * the to be drawn points as NSPoint strings, "type" as NSString
+ */
+- (NSDictionary*)coordinates
+{
+
+ char byteOrder;
+ UInt32 geoType, numberOfItems, numberOfSubItems, numberOfSubSubItems, numberOfCollectionItems;
+ st_point_2d aPoint;
+
+ NSUInteger i, j, k, n; // Loop counter for numberOf...Items
+ NSUInteger ptr = BUFFER_START; // pointer to geoBuffer while parsing
+
+ double x_min = 1e999;
+ double x_max = -1e999;
+ double y_min = 1e999;
+ double y_max = -1e999;
+
+ NSMutableArray *coordinates = [NSMutableArray array];
+ NSMutableArray *subcoordinates = [NSMutableArray array];
+
+ if (bufferLength < WKB_HEADER_SIZE)
+ return @"Header Error";
+
+ byteOrder = geoBuffer[ptr];
+
+ if(byteOrder != 0x1)
+ return @"Byte order not yet supported";
+
+ ptr++;
+ geoType = geoBuffer[ptr];
+ ptr += SIZEOF_STORED_UINT32;
+
+ switch(geoType) {
+
+ case wkb_point:
+ memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ x_min = aPoint.x;
+ x_max = aPoint.x;
+ y_min = aPoint.y;
+ y_max = aPoint.y;
+ [coordinates addObject:NSStringFromPoint(NSMakePoint(aPoint.x, aPoint.y))];
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSArray arrayWithObjects:
+ [NSNumber numberWithDouble:x_min],
+ [NSNumber numberWithDouble:x_max],
+ [NSNumber numberWithDouble:y_min],
+ [NSNumber numberWithDouble:y_max],
+ nil], @"bbox",
+ coordinates, @"coordinates",
+ @"POINT", @"type",
+ nil];
+ break;
+
+ case wkb_linestring:
+ numberOfItems = geoBuffer[ptr];
+ ptr += SIZEOF_STORED_UINT32;
+ for(i=0; i < numberOfItems; i++) {
+ memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ x_min = (aPoint.x < x_min) ? aPoint.x : x_min;
+ x_max = (aPoint.x > x_max) ? aPoint.x : x_max;
+ y_min = (aPoint.y < y_min) ? aPoint.y : y_min;
+ y_max = (aPoint.y > y_max) ? aPoint.y : y_max;
+ [coordinates addObject:NSStringFromPoint(NSMakePoint(aPoint.x, aPoint.y))];
+ ptr += POINT_DATA_SIZE;
+ }
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSArray arrayWithObjects:
+ [NSNumber numberWithDouble:x_min],
+ [NSNumber numberWithDouble:x_max],
+ [NSNumber numberWithDouble:y_min],
+ [NSNumber numberWithDouble:y_max],
+ nil], @"bbox",
+ coordinates, @"coordinates",
+ @"LINESTRING", @"type",
+ nil];
+ break;
+
+ case wkb_polygon:
+ numberOfItems = geoBuffer[ptr];
+ ptr += SIZEOF_STORED_UINT32;
+ for(i=0; i < numberOfItems; i++) {
+ numberOfSubItems = geoBuffer[ptr];
+ ptr += SIZEOF_STORED_UINT32;
+ for(j=0; j < numberOfSubItems; j++) {
+ memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ x_min = (aPoint.x < x_min) ? aPoint.x : x_min;
+ x_max = (aPoint.x > x_max) ? aPoint.x : x_max;
+ y_min = (aPoint.y < y_min) ? aPoint.y : y_min;
+ y_max = (aPoint.y > y_max) ? aPoint.y : y_max;
+ [subcoordinates addObject:NSStringFromPoint(NSMakePoint(aPoint.x, aPoint.y))];
+ ptr += POINT_DATA_SIZE;
+ }
+ [coordinates addObject:[[subcoordinates copy] autorelease]];
+ [subcoordinates removeAllObjects];
+ }
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSArray arrayWithObjects:
+ [NSNumber numberWithDouble:x_min],
+ [NSNumber numberWithDouble:x_max],
+ [NSNumber numberWithDouble:y_min],
+ [NSNumber numberWithDouble:y_max],
+ nil], @"bbox",
+ coordinates, @"coordinates",
+ @"POLYGON", @"type",
+ nil];
+ break;
+
+ // case wkb_multipoint:
+ // [wkt setString:@"MULTIPOINT("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE;
+ // for(i=0; i < numberOfItems; i++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE;
+ // }
+ // [wkt appendString:@")"];
+ // return wkt;
+ // break;
+ //
+ // case wkb_multilinestring:
+ // [wkt setString:@"MULTILINESTRING("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE;
+ // for(i=0; i < numberOfItems; i++) {
+ // numberOfSubItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // [wkt appendString:@"("];
+ // for(j=0; j < numberOfSubItems; j++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE;
+ // }
+ // ptr += WKB_HEADER_SIZE;
+ // [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""];
+ // }
+ // [wkt appendString:@")"];
+ // return wkt;
+ // break;
+ //
+ // case wkb_multipolygon:
+ // [wkt setString:@"MULTIPOLYGON("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE;
+ // for(i=0; i < numberOfItems; i++) {
+ // numberOfSubItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // [wkt appendString:@"("];
+ // for(j=0; j < numberOfSubItems; j++) {
+ // numberOfSubSubItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // [wkt appendString:@"("];
+ // for(k=0; k < numberOfSubSubItems; k++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (k < numberOfSubSubItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE;
+ // }
+ // [wkt appendFormat:@")%@", (j < numberOfSubItems-1) ? @"," : @""];
+ // }
+ // ptr += WKB_HEADER_SIZE;
+ // [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""];
+ // }
+ // [wkt appendString:@")"];
+ // return wkt;
+ // break;
+ //
+ // case wkb_geometrycollection:
+ // [wkt setString:@"GEOMETRYCOLLECTION("];
+ // numberOfCollectionItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ //
+ // for(n=0; n < numberOfCollectionItems; n++) {
+ //
+ // byteOrder = geoBuffer[ptr];
+ //
+ // if(byteOrder != 0x1)
+ // return @"Byte order not yet supported";
+ //
+ // ptr++;
+ // geoType = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ //
+ // switch(geoType) {
+ //
+ // case wkb_point:
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"POINT(%.16g %.16g)", aPoint.x, aPoint.y];
+ // ptr += POINT_DATA_SIZE;
+ // break;
+ //
+ // case wkb_linestring:
+ // [wkt appendString:@"LINESTRING("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // for(i=0; i < numberOfItems; i++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE;
+ // }
+ // [wkt appendString:@")"];
+ // break;
+ //
+ // case wkb_polygon:
+ // [wkt appendString:@"POLYGON("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // for(i=0; i < numberOfItems; i++) {
+ // numberOfSubItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // [wkt appendString:@"("];
+ // for(j=0; j < numberOfSubItems; j++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE;
+ // }
+ // [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""];
+ // }
+ // [wkt appendString:@")"];
+ // break;
+ //
+ // case wkb_multipoint:
+ // [wkt appendString:@"MULTIPOINT("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE;
+ // for(i=0; i < numberOfItems; i++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE;
+ // }
+ // ptr -= WKB_HEADER_SIZE;
+ // [wkt appendString:@")"];
+ // break;
+ //
+ // case wkb_multilinestring:
+ // [wkt appendString:@"MULTILINESTRING("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE;
+ // for(i=0; i < numberOfItems; i++) {
+ // numberOfSubItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // [wkt appendString:@"("];
+ // for(j=0; j < numberOfSubItems; j++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE;
+ // }
+ // ptr += WKB_HEADER_SIZE;
+ // [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""];
+ // }
+ // ptr -= WKB_HEADER_SIZE;
+ // [wkt appendString:@")"];
+ // break;
+ //
+ // case wkb_multipolygon:
+ // [wkt appendString:@"MULTIPOLYGON("];
+ // numberOfItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE;
+ // for(i=0; i < numberOfItems; i++) {
+ // numberOfSubItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // [wkt appendString:@"("];
+ // for(j=0; j < numberOfSubItems; j++) {
+ // numberOfSubSubItems = geoBuffer[ptr];
+ // ptr += SIZEOF_STORED_UINT32;
+ // [wkt appendString:@"("];
+ // for(k=0; k < numberOfSubSubItems; k++) {
+ // memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE);
+ // [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (k < numberOfSubSubItems-1) ? @"," : @""];
+ // ptr += POINT_DATA_SIZE;
+ // }
+ // [wkt appendFormat:@")%@", (j < numberOfSubItems-1) ? @"," : @""];
+ // }
+ // ptr += WKB_HEADER_SIZE;
+ // [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""];
+ // }
+ // ptr -= WKB_HEADER_SIZE;
+ // [wkt appendString:@")"];
+ // break;
+ //
+ // default:
+ // return @"Error geometrycollection type parsing";
+ // }
+ // [wkt appendString:(n < numberOfCollectionItems-1) ? @"," : @""];
+ // }
+ // [wkt appendString:@")"];
+ // return wkt;
+ break;
+
+ default:
+ return nil;
+ }
+ return nil;
+}
+
+/**
* Return the WKB type of the geoBuffer ie if buffer represents a POINT, LINESTRING, etc.
* according to stored wkbType in header file. It returns -1 if an error occurred.
*/