Вкратце: я думал, что единицы измерения карты будут в метрах или километрах, но это не кажется правильным. Они в десятичных градусах? Можно ли установить это как опцию в ArcGis?
Hi,
Я сотрудничаю с исследователем, использующим ArcGIS для наложения некоторых изображений компьютерного зрения на карту. Я создал файл привязки для проверки импорта растров в ArcGIS, но, похоже, я ошибся в масштабировании.
Я создал файл jgw для сопровождения изображения размером 1600x1600 пикселей, которое должно охватывать квадрат размером 8 на 8 метров. Мне удалось правильно расположить и повернуть его, но масштабирование очень сильно отличается.
0.005
0.0013043484005
0.00482687012982
-0.005
10.8090421
59.5502261

Обновление: я попытался, практически наугад, уменьшить масштаб изображения и отправил коллеге этот файл (обратите внимание, что я пропустил количество десятичных знаков в строке 1 и 4:
0.00000005
0.000000013043484005
0.0000000482687012982
-0.00000005
10.8090421
59.5502261
Полученное изображение выглядит так, намного ближе к тому, что я ищу.

Я создал файл jgw, используя простой скрипт Python, который считывает CSV-файл угловых позиций.
Входной CSV-файл:
Prosjekt,Felt,Kornart,Season,Date_image,BildeID,RuteID,OmtrentligHimmelretning,Hjorne,Koordinat-system,Latitude,Longitude
Multisens,Garder,SW,Harvest,30/08/2012,902,10,se,NedreHoyre,WGS-84,59.5501946,10.8092326
Multisens,Garder,SW,Harvest,30/08/2012,902,10,sw,NedreVenstre,WGS-84,59.5501637,10.809107
Multisens,Garder,SW,Harvest,30/08/2012,902,10,nw,OvreVenstre,WGS-84,59.5502261,10.8090421
Multisens,Garder,SW,Harvest,30/08/2012,902,10,ne,OvreHoyre,WGS-84,59.5502595,10.8091657
Скрипт Python:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def main():
data = pd.read_csv('pos.csv',header=0)
# Latitude is Y and longitude is X
# The corners are denoted as:
# a ----- b
# | |
# | |
# c ----- d
hjorne = data['Hjorne']
lat = data['Latitude']
lon = data['Longitude']
a = {
'lat': lat[ np.where(hjorne=='OvreVenstre')[0][0] ],
'lon': lon[ np.where(hjorne=='OvreVenstre')[0][0] ]
}
b = {
'lat': lat[ np.where(hjorne=='OvreHoyre')[0][0] ],
'lon': lon[ np.where(hjorne=='OvreHoyre')[0][0] ]
}
c = {
'lat': lat[ np.where(hjorne=='NedreVenstre')[0][0] ],
'lon': lon[ np.where(hjorne=='NedreVenstre')[0][0] ]
}
d = {
'lat': lat[ np.where(hjorne=='NedreHoyre')[0][0] ],
'lon': lon[ np.where(hjorne=='NedreHoyre')[0][0] ]
}
print a , b , c, d
# Pixels per meter is 1600 per 8 m
mPerPix = 8 / 1600.0
scalex = mPerPix
scaley = -mPerPix
# The skew rate is sin( image width ) [m/px]
rotationAngle = np.arctan2( b['lat'] - a['lat'], b['lon'] - a['lon'])
skewY = np.sin( rotationAngle ) * mPerPix
skewX = np.cos( rotationAngle ) * mPerPix
print rotationAngle
outfile = open('output.jgw','w')
# Line 1: A: pixel size in the x-direction in map units/pixel
# Line 2: D: rotation about y-axis
# Line 3: B: rotation about x-axis
# Line 4: E: pixel size in the y-direction in map units, almost always negative[3]
# Line 5: C: x-coordinate Longitude of the center of the upper left pixel
# Line 6: F: y-coordinate Latitude of the center of the upper left pixel
outfile.write( '{}\n{}\n{}\n{}\n{}\n{}\n'.format(
scalex, skewY, skewX, scaley, a['lon'], a['lat']))
outfile.close()