يمكنك إضافة صور على سطح خريطتك كطبقة وحدات. يتم وضع "طبقات المربّعات" فوق مربّع خريطة في مستوى تكبير/تصغير معيّن. باستخدام عدد كافٍ من المربّعات، يمكنك إضافة بيانات خريطة Google إلى الخريطة بأكملها، وذلك بمستويات تكبير متعددة.
مقدمة
تتيح لك طبقات المربّعات (المعروفة أحيانًا باسم "تراكبات المربّعات") superimpose
الصور على مربّعات الخريطة الأساسية من Google. هذه طريقة رائعة لإضافة بيانات
- مثل نقاط الاهتمام أو معلومات حركة المرور - والصور المحلية إلى
تطبيقك. وعند دمجها مع نوع الخريطة kGMSTypeNone
، تسمح لك ملفّات الأساس
باستبدال بيانات الخريطة الأساسية من Google ببياناتك.
تكون طبقات المربّعات مفيدة عندما تريد إضافة صور واسعة النطاق، والتي تغطي عادةً مناطق جغرافية كبيرة، إلى الخريطة. في المقابل، تكون تداخلات سطح الأرض مفيدة عندما تريد تثبيت صورة واحدة في نقطة واحدة على الخريطة.
إحداثيات المربّعات
تقسم Maps API الصور في كل مستوى تكبير إلى مجموعة من وحدات مربعة تشكل الخريطة، ويتم ترتيبها في شبكة منظمة. عندما يتم الانتقال في الخريطة إلى موقع جغرافي جديد أو إلى مستوى تكبير/تصغير جديد، تحدِّد واجهة برمجة التطبيقات Maps API المربّعات التي تكون مطلوبة، وتحوِّلها إلى مجموعة من المربّعات التي يجب استرجاعها.
بالنسبة إلى طريقة Google في عرض الإسقاط Mercator، يكون المربّع الذي يحتوي على الإحداثيَين (0,0) دائمًا في الزاوية الشمالية الغربية من الخريطة، مع زيادة قيم x
من الغرب إلى الشرق وزيادة قيم y
من الشمال إلى الجنوب.
تتم فهرسة شاشات المعلومات باستخدام إحداثيات x,y
من هذا المصدر. على سبيل المثال، عند
مستوى التكبير 2، عندما يتم تقسيم الأرض إلى 16 مربّعًا، يمكن
الإشارة إلى كل مربّع باستخدام زوج x,y
فريد:
كل مربّع من مربّعات الخريطة هو مربّع بحجم 256 x 256 نقطة. عند مستوى التكبير 0، يتم عرض العالم بأكمله في مربّع واحد. يزيد كل مستوى تكبير من التكبير بمقدار مرّتين. وبالتالي، في مستوى التكبير 1، سيتم عرض الخريطة كشبكة 2×2 من اللوحات، أو شبكة 4×4 في مستوى التكبير 2، أو شبكة 8×8 في مستوى التكبير 3، وهكذا. إذا كنت تنشئ صورًا لطبقة مربّعات، ستحتاج إلى إنشاء صورة جديدة بحجم 256×256 نقطة لكل مربّع في كل مستوى تكبير تريد توفيره.
إضافة طبقة مربّعات
- أنشئ مثيلًا لشيء
GMSURLTileLayer
أو فئة فرعية مخصّصة منGMSTileLayer
أوGMSSyncTileLayer
. - يمكنك اختياريًا تعديل السمة
zIndex
لتعديل موقعها في ما يتعلّق بطبقات المربّعات الأخرى. - خصِّص العنصر
GMSTileLayer
للخريطة من خلال ضبط سمةmap
.
توفّر حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لنظام التشغيل iOS ثلاث فئات يمكن استخدامها لتطبيق طبقة مربّعات. مع كل فئة، ستحتاج إلى تحديد كيفية جلب
شريحة الخريطة الصحيحة لمجموعة معيّنة من إحداثيات {x,y,zoom}
. في ما يلي الخيارات المتاحة:
- الفئة الفرعية
GMSSyncTileLayer
، التي تقدّم تنفيذtileForX:y:zoom
الذي يعرض نُسخUIImage
- الفئة الفرعية
GMSTileLayer
، التي توفّر تنفيذ الأسلوبrequestTileForX:y:zoom
غير المتزامن الذي يتصل لاحقًا بصورة مربّعة. - استخدِم الفئة الحالية،
GMSURLTileLayer
، لجلب المربّعات تلقائيًا من عناوين URL، مع تقديم العنصرGMSTileURLConstructor
.GMSURLTileLayer
هي فئة محدّدة لا يمكن إنشاء فئة فرعية منها.
في حال إنشاء فئة فرعية من GMSSyncTileLayer
أو GMSTileLayer
، سيؤدي تقديم نتيجة مربّع nil
إلى إبلاغ حزمة تطوير البرامج (SDK) لتطبيق "خرائط Google" لنظام التشغيل 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
يمكنك استخدام صور ذات عدد نقاط مرتفع لكل بوصة مع GMSSyncTileLayer
أو GMSURLTileLayer
من خلال ضبط tileSize
على 512.
تشير السمة tileSize
إلى عدد البكسلات التي ستفضّل صور المربّع المعروضة عرضها، ويكون هذا العدد تلقائيًا 256، وهو سمة
المربّع في خرائط Google على جهاز غير مزوّد بشاشة Retina.
إذا كنت تعرض مربّعات بدرجة كثافة بكسل عادية على جهاز بدرجة كثافة بكسل عالية، يمكنك تكبير
الصور من خلال ضبط tileSize
على 512. يُرجى العِلم أنّ تكبير الصور قد يؤدي إلى خفض
جودتها، خاصةً بالنسبة إلى الخطوط الدقيقة أو النصوص. لتحقيق أفضل النتائج، يجب مطابقة
tileSize
وعدد نقاط الصورة في البوصة مع الشاشة. ستظهر الخرائط المعروضة على جهاز Retina بأفضل شكل عند عرض صور بدرجة كثافة عالية للنقاط مع tileSize
512،
بينما ستظهر الخرائط المعروضة على جهاز غير مزوّد بشاشة Retina بأفضل شكل عند عرض صور عادية
وtileSize
التلقائي الذي يبلغ 256.
محو المربّعات القديمة
إذا أصبحت الوحدات المربّعة التي تقدّمها الطبقة "قديمة"، يجب استدعاء الطريقة
clearTileCache
على الطبقة لفرض إعادة تحميل. سيؤدي ذلك
إلى إعادة تحميل جميع المربّعات في هذه الطبقة.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];