Файл мира — это простой текстовый файл ASCII, состоящий из шести значений, разделенных символами новой строки. Формат следующий:
Изменение размера пикселя по оси Y (обычно 0,0), вращение вокруг оси X (обычно 0,0), отрицательный размер пикселя по оси Y, координата X верхнего центр левого пикселя Координата Y центра верхнего левого пикселя
Например:
60.00000000000. 00000000000.0000000000-60.0000000000440750.00000000003751290.0000000000
Вы можете создать этот файл, просто используя свой любимый текстовый редактор.
Файл World обычно имеет суффикс .wld
, но иногда он может содержать .tfw
, .tifw
, .jgw
или другие суффиксы в зависимости от файла изображения, с которым он поставляется.
Как получить значения для создания мирового формата файла?
Я исследовал создание формата файла мира и попытался создать его с помощью C ++ в Windows, может ли кто-нибудь подтвердить правильность того, откуда я получаю значения? литература о мировых форматах файлов довольно расплывчата. Я не использую вращение, поэтому предполагаю, что значения D и E всегда равны нулю.
Строка 1: A: размер пикселя в направлении x в единицах карты/пиксель.
p-> GetDeviceCaps (HORZRES); //HORZRES определяется в wingdi.h как ширина по горизонтали в
пикселях
Строка 2: D: вращение вокруг оси y//всегда 0, поскольку я не использую вращение
Строка 3: B: вращение вокруг оси x//всегда 0, поскольку я не использую вращение
Строка 4: E: размер пикселя в направлении y в единицах карты почти всегда отрицательное
p-> GetDeviceCaps (VERTRES); //ВЕРТРЕС определяется в wingdi.h как горизонтальная ширина в
пикселях
Строка 5: C: координата x центра верхнего левого пикселя//как вы получаете это значение?
Строка 6: F: координата y центра левого верхнего пикселя//как вы получите это значение?
Файлы World, используемые Esri, GDAL и т. д., имеют стандартный формат:
Обычно поворот равен 0 для обоих значений (не повернутый), но значения образуют 6-параметрическое аффинное преобразование между ячейками и миром; если вы разбираетесь в математике, вы могли бы ввести эти числа для точного вращения. Вот код для массива GDAL GeoTransform, который очень похож на файл мира:
double GeoTransform [6]; GeoTransform [0] = Xmin; //Верхний левый XGeoTransform [1] = CellSize; //Размер пикселя W-E GeoTransform [2] = 0; //Вращение, 0 если 'Север вверх' GeoTransform [3] = Ymax; //Вверху слева YGeoTransform [4] = 0; //Поворот, 0, если 'Север вверх' GeoTransform [5] = -CellSize; //Размер пикселя NS
В то время как файл мира заполняется следующим образом:
Ширина ячейки00 Высота ячейки (отрицательная) Координата X верхнего левая ячейка (центр) Координата Y верхней левой ячейки (центр)
Обратите внимание, что размер пикселя NS всегда отрицательный, так как растры начинаются в верхнем левом углу и читаются вниз. Все значения указаны в мировых единицах (метры, футы, градусы, дюймы и т. Д.).
Вот пример того, как я мог бы вычислить/создать файл мира в объектах Esri:
void GetWorldValuesFromActiveView (ESRI.ArcGIS.Framework.IApplication pApp) {ESRI.ArcGIS.ArcMapUI.IMxDocument pDoc = (ESRI.ArcGIS.ArcMapUI.IM.Document) pApp ESRI.ArcGIS.Carto.IActiveView pView = pDoc.ActiveView; ESRI.ArcGIS.Geometry.IEnvelope pExtent = pView.Extent; //границы отображения в мировых единицах ESRI.ArcGIS.esriSystem.tagRECT pPixBnd = pView.ExportFrame; //границы отображения в единицах экрана//ширина и высота ячеек, я использую абсолютное значение//поскольку (очень редко) экран может иметь отрицательные координаты int Rows = Math.Abs (pPixBnd.top - pPixBnd.bottom); int Cols = Math.Abs (pPixBnd.right - pPixBnd.left); double Width = pExtent.XMax - pExtent.XMin; //ширина в "мировых" единицах double Height = pExtent.YMax - pExtent.YMin; двойной CellX = ширина/столбцы; двойной CellY = Высота/Ряды; двойной ULX = pExtent.XMin + (CellX/2); двойной ULY = pExtent.YMax - (CellY/2); используя (System.IO.StreamWriter pWorldWrite = new System.IO.StreamWriter ("c: \ путь \ к \ world \ file.tfw")) {pWorldWrite.WriteLine (CellX.ToString ()); pWorldWrite.WriteLine («0»); pWorldWrite.WriteLine («0»); pWorldWrite.WriteLine ("-" + CellY.ToString ()); pWorldWrite.WriteLine (ULX.ToString ()); pWorldWrite.WriteLine (ULY.ToString ()); }}
Как видно из приложения, вы должны знать, сколько пикселей находится в окне, а также какую протяженность «на земле» представляют эти пиксели. Если вы пишете свое собственное приложение, вы должны знать эти значения в какой-то момент, поскольку они являются неотъемлемой частью рендеринга для отображения.