В настоящее время у меня есть UIView
, который рисует радиолокационные данные поверх MKMapView
с использованием OpenGL. Из-за уровня детализации изображения радара требуется OpenGL (CoreGraphics недостаточно быстр).
Все изображения, которые я рисую, сохраняются в MKMapPoints
. Я выбираю их по стандарту CLLocationCoordinate2D
, потому что их длина не зависит от широты. Основной метод рисования таков:
- Добавьте
GLView
как подпредставление MKMapView
и установите GLView.frame = MKMapView.frame
.
Используя GLOrthof
, установите проекцию GLView
равной текущему видимому MKMapRect
карты. Вот код, который делает это.
CLLocationCoordinate2D coordinateTopLeft =
[mapView convertPoint:CGPointMake(0, 0)
toCoordinateFromView:mapView];
MKMapPoint pointTopLeft = MKMapPointForCoordinate(coordinateTopLeft);
CLLocationCoordinate2D coordinateBottomRight =
[mapView convertPoint:CGPointMake(mapView.frame.size.width,
mapView.frame.size.height)
toCoordinateFromView:mapView];
MKMapPoint pointBottomRight = MKMapPointForCoordinate(coordinateBottomRight);
glLoadIdentity();
glOrthof(pointTopLeft.x, pointBottomRight.x,
pointBottomRight.y, pointTopLeft.y, -1, 1);
Установите правильный размер области просмотра, используя glViewport(0, 0, backingWidth, backingHeight)
, где backingWidth
и backingHeight
- это размер mapView
в точках.
- Нарисуйте, используя
glDrawArrays
. Не уверен, что это имеет значение, но GL_VERTEX_ARRAY
и GL_TEXTURE_COORD_ARRAY
оба включены во время розыгрыша.
При использовании этого метода все работает нормально. Рисунок выполняется так, как и должно быть. Единственная проблема состоит в том, что, поскольку это подпредставление mapView
(а не наложение), радиолокационное изображение рисуется поверх любых других MKAnnotations
и MKOverlays
. Мне нужно, чтобы этот слой был нарисован под другими аннотациями и наложениями.
Я попытался сделать так, чтобы glView
было подпрограммой пользовательского MKOverlayView
вместо mapView
. Я дал MKOverlay
a boundingMapRect
из MKMapRectWorld
и установил рамку glView
так же, как я установил проекцию (поскольку рамка MKOverlayView
определяется MKMapPoints
, а не CGPoints
). Опять же, вот код.
CLLocationCoordinate2D coordinateTopLeft =
[mapView convertPoint:CGPointMake(0, 0)
toCoordinateFromView:mapView];
MKMapPoint pointTopLeft = MKMapPointForCoordinate(coordinateTopLeft);
CLLocationCoordinate2D coordinateBottomRight =
[mapView convertPoint:CGPointMake(mapView.frame.size.width,
mapView.frame.size.height)
toCoordinateFromView:mapView];
MKMapPoint pointBottomRight = MKMapPointForCoordinate(coordinateBottomRight);
glRadarView.frame = CGRectMake(pointTopLeft.x, pointTopLeft.y,
pointBottomRight.x - pointTopLeft.x,
pointBottomRight.y - pointTopLeft.y);
Когда я это делаю, glView
правильно позиционируется на экране (в том же месте, в котором он находился во время подпредставления mapView
), но рисунок больше не работает правильно. Когда изображение действительно появляется, это не правильный размер и не в правильном местоположении. Я сделал проверку, и backingWidth
и backingHeight
по-прежнему имеют размер представления в точках (как и должно быть).
Есть идеи, почему это не работает?