Я хочу разработать приложение для iOS, которое отображает Open Street Map в автономном режиме.IOS

Программируем под IOS
Ответить
Anonymous
 Я хочу разработать приложение для iOS, которое отображает Open Street Map в автономном режиме.

Сообщение Anonymous »

Я хочу разработать приложение, которое отображает карту Open Street Map в автономном режиме. Я сохраняю фрагмент карты Open Street следующим образом.

Код: Выделить всё

class HomeViewController: UIViewController, GMSMapViewDelegate, CLLocationManagerDelegate, DistanceCalculationDelegate{
func startMonitoringNetwork() {
if let currentLatString = UserDefaults.standard.string(forKey: "myLat"),
let currentLonString = UserDefaults.standard.string(forKey: "myLon"),
let currentLat = Double(currentLatString),
let currentLon = Double(currentLonString) {
let zoomLevel = 15
let centerTileCoords = tileCoordinates(fromLatitude: currentLat, longitude: currentLon, zoomLevel: zoomLevel)

let range = 4
for dx in -range...range {
for dy in -range...range {
let tileX = centerTileCoords.x + dx
let tileY = centerTileCoords.y + dy
downloadTile(zoom: zoomLevel, x: tileX, y: tileY)
}
}
}
}

func downloadTile(zoom: Int, x: Int, y: Int) {
let urlString = "https://tile.openstreetmap.org/\(zoom)/\(x)/\(y).png"
guard let url = URL(string: urlString) else { return }
print(url)
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else { return }

self.saveTileData(data, zoom: zoom, x: x, y: y)
}

task.resume()
}

func saveTileData(_ data: Data, zoom: Int, x: Int, y: Int) {
let fileManager = FileManager.default
guard let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

let zoomDir = documentsDirectory.appendingPathComponent("tiles/\(zoom)")
let xDir = zoomDir.appendingPathComponent("\(x)")

if !fileManager.fileExists(atPath: xDir.path) {
try? fileManager.createDirectory(at: xDir, withIntermediateDirectories: true)
}

let tileFilePath = xDir.appendingPathComponent("\(y).png")
do {
try data.write(to: tileFilePath)
print("Tile saved: \(tileFilePath.path)")
} catch {
print("Error saving tile: \(error)")
}
}

}

Таким образом сохраняются следующие данные.
`file:///var/mobile/Containers/Data/Application/2316925A-8954 -4407-A286-AF81F862F2D2/Documents/tiles/15/29096/12903.png
file:///var/mobile/Containers/Data/Application/2316925A-8954-4407- A286-AF81F862F2D2/Documents/tiles/15/29096/12903.png
file:///var/mobile/Containers/Data/Application/2316925A-8954-4407-A286-AF81F862F2D2 /Documents/tiles/15/29096/12903.png
file:///var/mobile/Containers/Data/Application/2316925A-8954-4407-A286-AF81F862F2D2/Documents/ tiles/15/29096/12903.png`
Но данные, извлеченные из следующего кода.

Код: Выделить всё

class OpenStreetMapController: UIViewController, MKMapViewDelegate {

@IBOutlet weak var openStreetMap: MKMapView!

override func viewDidLoad() {
super.viewDidLoad()

let overlay = CustomTileOverlay(urlTemplate: nil)
let tilePath = MKTileOverlayPath(x: 35, y: 139, z: 17, contentScaleFactor: 1.0)
overlay.loadTile(at: tilePath) { (data, error) in
}
overlay.canReplaceMapContent = true
openStreetMap.addOverlay(overlay)
openStreetMap.delegate = self

}

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let tileOverlay = overlay as? MKTileOverlay {
let renderer = MKTileOverlayRenderer(tileOverlay: tileOverlay)
return renderer
}
return MKOverlayRenderer()
}

class CustomTileOverlay: MKTileOverlay {

override func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) ->  Void) {
let fileManager = FileManager.default
guard let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else {
result(nil, NSError(domain: "TileErrorDomain", code: 0, userInfo: nil))
return
}

let tileFilePath = documentsDirectory
.appendingPathComponent("tiles/\(path.z)")
.appendingPathComponent("\(path.x)")
.appendingPathComponent("\(path.y).png")
print(tileFilePath)

if let tileData = try? Data(contentsOf: tileFilePath) {
result(tileData, nil)
} else {
result(nil, NSError(domain: "TileErrorDomain", code: 1, userInfo: nil))
}
}
`file: ///var/mobile/containers/data/application/7c2ab696-8425-4da7-a2aa-0856c4b4c677/documents/tiles/17/139.png
file:///var/mobile/Containers/Data/Application/7C2AB696-8425-4DA7-A2AA-0856C4B4C677/Documents/tiles/6/54/24.pngfile:///var/mobile/Containers/Data/Application/7C2AB696-8425-4DA7-A2AA-0856C4B4C677/Documents/tiles/6/57/26.png
file:///var/mobile/Containers/Data/Application/7C2AB696-8425-4DA7-A2AA-0856C4B4C677/Documents/tiles/6/57/20.png
`
Пожалуйста, сообщите мне причину.
Я разрабатываю этот код с помощью ChatGPT. Но это неправильно. Я не знаю, как решить эту проблему.

Подробнее здесь: https://stackoverflow.com/questions/782 ... ap-offline
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»