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

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

Сообщение Anonymous »

Я хочу разработать приложение, которое отображает OpenStreetMap в автономном режиме. Я сохраняю плитку OpenStreetMap следующим образом: < /p>

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

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)")
}
}
}
< /code>
Следующие данные сохраняются таким образом.  < /p>
[list]
[*]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
[/list]
But the data taken out are these С следующим кодом: < /p>
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/35/139.png />
  • file://var/mobile/containers/data/application/7c2ab696-8425-4da7-a2aa-0856c4b4c677/documents/tiles/6/54/24.png
  • file://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»