يمكنك إضافة صور في أعلى الخريطة كطبقة تجانب. يتم وضع طبقات المربعات أعلى مربع الخريطة على مستوى تكبير/تصغير محدد. باستخدام عدد كافٍ من المربعات، يمكنك تكملة بيانات خريطة Google للخريطة بأكملها على مستويات تكبير/تصغير متعددة.
المقدمة
تتيح لك طبقات المربعات (التي يُشار إليها أحيانًا باسم تراكبات المربعات) تركيب الصور فوق مربعات الخرائط الأساسية في Google. هذه طريقة ممتازة لإضافة البيانات، مثل نقاط الاهتمام أو معلومات حركة المرور، والصور المحلية إلى تطبيقك. عند دمجها مع نوع الخريطة kGMSTypeNone
، تتيح لك طبقات الفئات إمكانية استبدال بيانات الخريطة الأساسية في Google ببياناتك.
تكون طبقات المربّعات مفيدة عندما تريد إضافة صور شاملة، تغطي عادةً مناطق جغرافية كبيرة، إلى الخريطة. على النقيض، تكون تراكبات الأرضية مفيدة عندما ترغب في إصلاح صورة واحدة في نقطة ما على الخريطة.
إحداثيات المربعات
تقسم واجهة برمجة تطبيقات الخرائط الصور عند كل مستوى من التكبير/التصغير إلى مجموعة من مربعات الخرائط المربعة، والتي يتم ترتيبها في شبكة مرتبة. عند تمرير الخريطة إلى موقع جديد، أو إلى مستوى تكبير/تصغير جديد، تحدد API للخرائط المربعات التي تحتاجها، وتترجم ذلك إلى مجموعة من المربعات للاسترداد.
بالنسبة إلى تنفيذ Google لإسقاط ماركاتور، يكون المربع الذي يحمل
الإحداثيات (0,0) دائمًا في الركن الشمالي الغربي من الخريطة، مع زيادة قيم x
من الغرب إلى الشرق وزيادة قيم y
من الشمال إلى الجنوب.
تتم فهرسة المربعات باستخدام إحداثيات x,y
من هذا الأصل. على سبيل المثال، في المستوى 2 من التكبير/التصغير، عند تقسيم الأرض إلى 16 جزءًا، يمكن الإشارة إلى كل مربع من خلال زوج x,y
فريد:
مربع كل مربع هو مربع 256x256. في مستوى التكبير/التصغير 0، يتم عرض العالم بأسره في مربع واحد. يزيد كل مستوى تكبير من التكبير بمقدار عاملين. ولذلك، عند مستوى التكبير 1، سيتم عرض الخريطة كشبكة من 2x2 من المربعات، أو شبكة 4x4 في مستوى التكبير/التصغير 2، وشبكة 8x8 في مستوى التكبير/التصغير 3، وهكذا. إذا كنت تنشئ صورًا لطبقة تجانب، فسيتعين عليك إنشاء صورة جديدة بحجم 256x256 لكل مربع في كل مستوى تكبير ترغب في دعمه.
إضافة طبقة تجانب
- إنشاء كائن
GMSURLTileLayer
أو فئة فرعية مخصصة منGMSTileLayer
/GMSSyncTileLayer
. - يمكنك اختياريًا تعديل الخاصية
zIndex
لضبط موضعها بالنسبة إلى طبقات المربّعات الأخرى. - حدِّد العنصر
GMSTileLayer
على الخريطة من خلال ضبط السمةmap
.
توفر حزمة SDK للخرائط لنظام التشغيل iOS ثلاث فئات يمكن استخدامها لتنفيذ طبقة تجانب. مع كل فئة، ستحتاج إلى تحديد كيفية جلب مربع الخريطة الصحيح لمجموعة معينة من إحداثيات {x,y,zoom}
. والخيارات المتاحة هي:
- فئة فرعية
GMSSyncTileLayer
، تقدّم تنفيذtileForX:y:zoom
التي تعرضUIImage
مثيلات. - فئة فرعية
GMSTileLayer
، يتم من خلالها تنفيذ الطريقة غير المتزامنةrequestTileForX:y:zoom
التي تستدعي لاحقًا صورة مربّعة. - استخدِم الصف الحالي،
GMSURLTileLayer
، لجلب المربّعات تلقائيًا من عناوين URL، ما يوفّر الحظرGMSTileURLConstructor
.GMSURLTileLayer
هي فئة ملموسة لا يمكن تصنيفها فرعيًا.
في حالة الفئة الفرعية GMSSyncTileLayer
أو GMSTileLayer
، سيؤدي تقديم نتيجة مربّع nil
إلى إعلام حزمة تطوير البرامج (SDK) للخرائط لنظام التشغيل iOS بأن البيانات غير متاحة حاليًا ولكنها قد تكون متاحة في المستقبل. بدلاً من ذلك، يمكنك عرض kGMSTileLayerNoTile
للإشارة إلى عدم وجود مربع في هذا الموقع.
بالنسبة إلى GMSURLTileLayer
، يشير إرجاع nil
من GMSTileURLConstructor
إلى عدم وجود مربع في هذا الموقع.
استخدام `GMSURLTileLayer` لجلب المربعات من عناوين URL
لا يتطلب GMSURLTileLayer
فئة فرعية، ولكن سيتعين عليك
تنفيذ حظر GMSTileURLConstructor
. يوضح الرمز أدناه كيفية
استخدام GMSURLTileLayer
لعرض مخطط طابق لمبنى متعدد الطوابق.
Swift
let floor = 1 // Implement GMSTileURLConstructor // Returns a Tile based on the x,y,zoom coordinates, and the requested floor let urls: GMSTileURLConstructor = { (x, y, zoom) in let url = "https://www.example.com/floorplans/L\(floor)_\(zoom)_\(x)_\(y).png" return URL(string: url) } // Create the GMSTileLayer let layer = GMSURLTileLayer(urlConstructor: urls) // Display on the map at a specific zIndex layer.zIndex = 100 layer.map = mapView
Objective-C
NSInteger floor = 1; // Create the GMSTileLayer GMSURLTileLayer *layer = [GMSURLTileLayer tileLayerWithURLConstructor:^NSURL * _Nullable(NSUInteger x, NSUInteger y, NSUInteger zoom) { NSString *url = [NSString stringWithFormat:@"https://www.example.com/floorplans/L%ld_%lu_%lu_%lu.png", (long)floor, (unsigned long)zoom, (unsigned long)x, (unsigned long)y]; return [NSURL URLWithString:url]; }]; // Display on the map at a specific zIndex layer.zIndex = 100; layer.map = mapView;
فئة فرعية GMSSyncTileLayer
لعرض المربعات كـ UIImage
GMSSyncTileLayer
وGMSTileLayer
فئات مجردة تم تصميمها لتكون فئة فرعية. يمكنك استخدام هذه الصفوف لعرض المربّعات كـ UIImage
. يوضح المثال أدناه كيفية عرض صورة مخصصة على بعض المربّعات على الخريطة عن طريق الفئة الفرعية GMSSyncTileLayer
.
Swift
class TestTileLayer: GMSSyncTileLayer { override func tileFor(x: UInt, y: UInt, zoom: UInt) -> UIImage? { // On every odd tile, render an image. if (x % 2 == 1) { return UIImage(named: "australia") } else { return kGMSTileLayerNoTile } } }
Objective-C
@interface TestTileLayer : GMSSyncTileLayer @end @implementation TestTileLayer - (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom { // On every odd tile, render an image. if (x % 2 == 1) { return [UIImage imageNamed:@"australia"]; } else { return kGMSTileLayerNoTile; } } @end
لإضافة الطبقة إلى خريطتك، أنشئ مثيلاً للكائن وعيّن خاصية الخريطة الخاصة به.
Swift
let layer = TestTileLayer() layer.map = mapView
Objective-C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
أقسام DPI العالية لأجهزة Retina
يمكنك استخدام صور عالية لكل بوصة (DPI) مع GMSSyncTileLayer
أو GMSURLTileLayer
من خلال ضبط tileSize
على 512.
تشير السمة tileSize
إلى عدد وحدات البكسل التي تفضل صور المربعات التي يتم عرضها
الظهور على أنها 256 بكسل تلقائيًا؛ وهي بُعد مربّع "خرائط Google" على جهاز بخلاف جهاز Retina.
إذا كنت تعرض مربعات النقاط لكل بوصة (DPI) العادية على جهاز يتضمّن عددًا كبيرًا من النقاط لكل بوصة، يمكنك تغيير حجم الصور من خلال ضبط قيمة tileSize
على 512. لاحظ أن ترقية الصور قد تؤدي إلى تقليل جودة الصورة، خاصة للخطوط أو النصوص. للحصول على أفضل النتائج، طابِق بين tileSize
ونقطة لكل بوصة (DPI) للصورة على الشاشة. ستبدو الخرائط المعروضة على جهاز Retina أفضل حالاتها عند عرض صور عالية لكل بوصة (DPI) مع tileSize
بنسبة 512، في حين ستبدو الخرائط المعروضة على جهاز غير ريتيني رائعة مع الصور العادية وtileSize
التلقائية من 256.
إزالة البلاط القديم
إذا أصبحت المربعات التي تقدّمها الطبقة "قديمة"، يجب استدعاء الطريقة
clearTileCache
في الطبقة لفرض التحديث. سيؤدي ذلك إلى إعادة تحميل كل المربعات في هذه الطبقة.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];