Я знаю, как преобразовать геометрию MySQL из двоичного файла в текст, а затем передать / преобразовать ее для использования в MapKit. Однако это кажется излишне неэффективным. Я ищу способ передачи бинарных фигур (например, полигонов) их родственникам Mapkit (например, MkPolygon) с учетом эффективности использования полосы пропускания.
Есть ли способ напрямую потреблять эти двоичные формы и конвертировать в iOS?
Достаточно ли легко разобрать двоичный формат?
Я хотел бы избегать преобразования в текст, а затем обратно в двоичный файл, пока он не будет, по крайней мере, на мобильном устройстве, чтобы избежать раздувания по сети передачи миллионов чисел с плавающей запятой двойной точности, отображаемых в виде символьных строк.
Я нашел ShapeKit Майкла Вейсмана на GitHub, который берет геометрию GEOS и выплевывает объекты MapKit. Однако ShapeKit полагается на WKT в качестве отправной точки, если у вас нет полностью созданного экземпляра объекта GEOS. Поэтому я взломал его, чтобы построить геометрию GEOS из байтов WKB (путем помещения данных MySQL WKB в NSData), но кажется, что двоичный файл, возвращаемый из MySQL, не совсем то, что он ожидал. Возможно, есть проблема с порядком байтов ...?
@implementation ShapeKitGeometry
@synthesize wktGeom,geomType, projDefinition ,geosGeom, numberOfCoords;
- (id) init
{
self = [super init];
if (self != nil) {
// initialize GEOS library
handle = initGEOS_r(notice, log_and_exit);
}
return self;
}
-(id)initWithWKB:(const unsigned char *) wkb size:(size_t)wkb_size {
[self init];
GEOSWKBReader *WKBReader = GEOSWKBReader_create_r(handle);
self.geosGeom = GEOSWKBReader_read_r(handle, WKBReader, wkb, wkb_size);
GEOSWKBReader_destroy_r(handle, WKBReader);
self.geomType = [NSString stringWithUTF8String:GEOSGeomType_r(handle, geosGeom)];
return self;
}
// .... later in my appDelegate:
- (ShapeKitPolygon *)loadWKBPolygonFromFile:(NSString *)file {
ShapeKitPolygon * poly = nil;
NSString *path = [[NSBundle mainBundle] pathForResource:file ofType:@"plist"];
NSDictionary *stupidDict = [NSDictionary dictionaryWithContentsOfFile:path];
NSData *geomData = [stupidDict objectForKey:@"shape"];
if (geomData && [geomData length]) {
poly = [[[ShapeKitPolygon alloc] initWithWKB:[geomData bytes] size:[geomData length]] autorelease];
}
return poly;
}
Мысли