Saatnya untuk menulis jawaban yang solid untuk pertanyaan saya ini (Saya bisa saja menulisnya setahun yang lalu tetapi entah bagaimana saya kehilangannya dari pikiran saya).
Apakah MapKit memiliki fungsi ubin (cara Google Maps) yang siap pakai dan apakah saya perlu mengerjakannya tambahan, jika tidak?
Jawabannya adalah ya: MapKit memang memilikinya. Kata kunci di sini adalah overlays (MKOverlay, MKOverlayView and others)
. Lihat jawaban saya yang lain.
Lihat juga:
Sesi WWDC 2010: Menyesuaikan Peta dengan Hamparan,
Apple-WWDC10-TileMap.
Apa praktik terbaik dalam mengambil informasi tempat (posisi penanda dan anotasi) dari server?
Sebenarnya sejak itu saya tidak belajar banyak tentang "praktik terbaik" - sayangnya, tidak ada yang memberi tahu saya tentang praktik tersebut :( - itu sebabnya saya akan menjelaskan "praktik saya".
Pertama-tama, ada dua strategi mengisi peta MapKit dengan tempat:
Strategi pertama adalah mengisi peta Anda dengan tempat-tempat berdasarkan permintaan: bayangkan Anda ingin menampilkan dan melihat semua tempat terdekat (misalnya, tidak lebih dari 1 km dari lokasi pengguna saat ini) - pendekatan ini mengasumsikan bahwa Anda tanyakan pada server Anda hanya tempat untuk kotak yang Anda minati. Artinya seperti: "jika saya berada di Berlin (dan saya mengharapkan 200 tempat untuk Berlin), mengapa saya harus mengambil tempat dari Rusia, Jepang, .. .(10.000+ tempat)".
Pendekatan ini mengarah pada mengandalkan fungsionalitas "ubin" yang mempertanyakan alamat N1: Peta Google dan peta Apple biasanya digambar menggunakan 'ubin' jadi untuk bagian peta "Berlin" Anda mengandalkan ubin "Berlin" yang sesuai yang digambar oleh MKMapView - Anda menggunakan dimensinya, untuk menanyakan server Anda hanya tempat di dalam kotak "Berlin" (lihat jawaban tertaut saya dan aplikasi demo di sana).
Awalnya ini adalah pendekatan yang saya gunakan dan implementasi saya bekerja dengan sempurna tetapi kemudian saya terdorong untuk menggunakan pendekatan kedua (lihat di bawah) karena muncul masalah clustering.
Strategi kedua adalah mengambil semua tempat sekaligus (ya, semuanya 10.000+ atau lebih) dan menggunakan Data Inti untuk mengambil tempat yang diperlukan untuk bagian peta yang Anda minati.
Pendekatan kedua berarti, bahwa selama proses pertama Anda mengirim permintaan ke server Anda untuk mengambil semua tempat (saya memiliki sekitar 2000 di aplikasi saya). Penting di sini adalah Anda membatasi bidang yang Anda ambil hanya pada bidang geografis yang benar-benar Anda perlukan untuk peta Anda: id
, latitude
, longitude
.
Pengambilan 'ambil-semua' ini memiliki dampak yang signifikan pada waktu mulai pertama aplikasi saya (Pada iPhone 4 "yang tertua", saya memiliki waktu hampir 700 md untuk keseluruhan proses Fetch + Parse-JSON-into-Core-Data
, dan tolok ukur ekstensif menunjukkan kepada saya bahwa itu adalah Data Inti dan sisipannya merupakan hambatan) namun Anda memiliki semua informasi geografis penting tentang tempat Anda di perangkat Anda.
Perhatikan, apa pun strategi yang Anda gunakan, Anda harus melakukan proses pengambilan titik geografis ini secara efisien:
Bayangkan entitas Data Inti Place
yang memiliki struktur bidang berikut (kode preudo-Objective-C):
// Unique identificator
NSNumber *id,
// Geo info
NSNumber *latitude,
NSNumber *longitude,
// The rest "heavy" info
NSString *name,
NSString *shortDescription,
NSString *detailedDescription, etc
Mengambil tempat secara efisien berarti Anda hanya meminta tempat Anda mencatat data geografis dari server Anda untuk membuat proses pencerminan ini secepat mungkin.
Lihat juga topik hangat ini: Meningkatkan proses pencerminan database server ke database klien melalui JSON?.
Masalah pengelompokan berada di luar cakupan pertanyaan ini tetapi masih sangat relevan dan memengaruhi keseluruhan algoritma yang Anda gunakan untuk keseluruhan proses - satu-satunya catatan yang akan saya tinggalkan di sini adalah bahwa semua solusi pengelompokan yang ada saat ini akan mengharuskan Anda menggunakan strategi kedua - Anda harus menyiapkan semua tempat sebelum Anda menjalankan algoritme pengelompokan yang akan mengatur tempat Anda di peta - artinya jika Anda memutuskan untuk menggunakan pengelompokan, Anda harus menggunakan strategi #2.
Tautan yang relevan tentang pengelompokan:
Sesi WWDC 2011: Memvisualisasikan Informasi Secara Geografis dengan MapKit,
Cara Menampilkan Data dalam Jumlah Besar di iOS secara Efisien Peta,
kingpin - Solusi pengelompokan sumber terbuka: berkinerja baik dan mudah digunakan.
Apakah mungkin untuk menyimpan informasi ini dalam cache sehingga pengguna dapat melihat tempat-tempat terdekat di "kotanya" dalam mode offline?
Ya, kedua strategi melakukan hal ini: yang pertama menyimpan cache tempat-tempat yang Anda lihat di peta - jika Anda mengamati bagian peta Berlin, bagian Berlin akan di-cache...
Saat menggunakan strategi kedua: Anda akan memiliki semua informasi geografis penting tentang tempat Anda dalam cache dan siap untuk digambar pada peta dalam mode offline (dengan asumsi MapKit menyimpan gambar peta wilayah yang Anda jelajahi dalam mode offline).
person
Stanislav Pankevich
schedule
26.01.2014