Tôi đang sử dụng thư viện GDAL. Hiện tại, tôi có thể chụp ở góc trên bên trái và một điểm trên bên phải và cắt một hình ảnh ra khỏi ảnh gốc. Những gì tôi muốn làm bây giờ, được lấy trong hai điểm WKT và chuyển đổi sang X, Y phối hợp để làm điều tương tự. Tôi đã chỉ tự hỏi nếu nó đã có thể làm điều này nếu tôi biết GeoTransform và những gì phối hợp hệ thống nó đã được sử dụng (WGS84)?Nếu bạn có một GeoTiff, nó sẽ có thể biến đổi một điểm Lat/Lon thành X, Y bằng cách sử dụng GeoTransform?
Trả lời
Tôi đã sử dụng biến đổi affine cho hình ảnh để tính toán một số vĩ độ/kinh độ mẫu. Vấn đề duy nhất tôi gặp phải là nếu hình ảnh là Mặt trận hướng Bắc, geoTransform [2] và geTransform [4] cần phải được đánh số ra khi tính toán độ lớn/vĩ độ.
x = (int)Math.Abs(Math.Round((Latitude - geotransform[0])/geotransform[1]));
y = (int)Math.Abs(Math.Round((Longitude - geotransform[3])/geotransform[5]));
Nếu bạn muốn sức mạnh vũ phu nó, bạn có thể làm như sau (tôi đã làm điều này và nó làm việc nhưng điều này chỉ là giả):
//Get the Pixel for the length and width, this portion is for the full image
pixelXSize = AbsoluteValue((latitudeAt(Zero)-(latitudeAt(Length)-1))/imageLength);
pixelYSize = AbsoluteValue((longitudeAt(Zero)-(LongitudeAt(Width)-1))/imageWidth);
//Calculate the x,y conversion for the points you want to calculate
x = AbsoluteValue((latitudeToConvert-latitudeAt(Zero))/pixelXSize);
y = AbsoluteValue((longitudeToConvert-longitudteAt(Zero))/pixelYSize);
Câu trả lời này có thể được tắt bằng một hoặc hai pixel. Nếu bạn đang sử dụng một biến đổi địa lý, một lần nữa các biến North Facing có thể làm hỏng câu trả lời được trả về. Cho đến nay, tôi đã chỉ thử nghiệm này cho hình ảnh phía bắc phải đối mặt.
Tôi đoán câu hỏi của tôi ở đây sẽ là cách xử lý hình ảnh không phải hướng bắc. – avtoader
Tôi đã từng tham gia điều này trước đây và đây là cách thực hiện các phép biến đổi tọa độ hợp lý.
Lưu ý từ GDAL documentation:
Các hệ tọa độ được trả về bởi GDALDataset :: GetProjectionRef() mô tả tọa độ tham chiếu hình học ngụ ý bởi affine tham chiếu địa lý biến đổi được trả về bởi GDALDataset :: GetGeoTransform().
Chúng tôi có thể sử dụng điều này với OGRCoordinateTransformation để thực hiện chuyển đổi cho chúng tôi.
Về cơ bản mã sẽ giống như thế này:
// Load up some dataset.
dataset = (GDALDataset *) GDALOpen(mapfile, GA_ReadOnly);
// Define Geographic coordinate system - set it to WGS84.
OGRSpatialReference *poSRS_Geog = new OGRSpatialReference();
poSRS_Geog->importFromEPSG(4326); // WGS84
// Define Projected coordinate system - set to the GeoTransform.
const char *sProj = dataset->GetProjectionRef();
OGRSpatialReference *poSRS_Proj = new OGRSpatialReference(sProj);
// Set up the coordinate transform (geographic-to-projected).
OGRCoordinateTransformation *poCT_Geog2Proj;
poCT_Geog2Proj = OGRCreateCoordinateTransformation(poSRS_Geog, poSRS_Proj);
// Now everything is set up and we set transforming coordinates!
// Pass Lon/Lat coordinates to the Transform function:
double x = lon;
double y = lat;
poCT_Geog2Proj->Transform(1, &x, &y);
// Now x and y variables will contain the X/Y pixel coordinates.
Đó là cách bạn có thể chuyển đổi giữa kinh độ/vĩ độ và điểm ảnh tọa độ. Lưu ý bạn có thể sử dụng mảng với Transform()
và chuyển đổi nhiều tọa độ cùng nhau. Đối số đầu tiên là số cặp tọa độ cần chuyển đổi, và đối số thứ hai và thứ ba là con trỏ trỏ tới x và y. Tôi chỉ biến đổi một cặp ở đây.
Lưu ý nó không kém phần dễ dàng để thiết lập nghịch đảo:
// Set up the coordinate transform (projected-to-geographic).
OGRCoordinateTransformation *poCT_Proj2Geog;
poCT_Proj2Geog = OGRCreateCoordinateTransformation(poSRS_Proj, poSRS_Geog);
tôi sử dụng phương pháp này:
void transformCoordinatesEPSG(OGRGeometry &geometry,int from, int to) {
OGRSpatialReference srcSpatialReference;
OGRErr error = srcSpatialReference.importFromEPSG(from);
#ifdef __OGRTRANSFORMDEBUG
qDebug() << "Import EPSG " << from << "return " << error;
#endif
OGRSpatialReference dstSpatialReference;
error = error | dstSpatialReference.importFromEPSG(to);
#ifdef __OGRTRANSFORMDEBUG
qDebug() << "Import EPSG " << to << "return " << error;
#endif
OGRCoordinateTransformation* coordTrans = OGRCreateCoordinateTransformation(&srcSpatialReference, &dstSpatialReference);
geometry.transform(coordTrans);
}
Đối lat/dài để phải 4326.
- 1. Cách vẽ điểm theo vị trí x/y bằng cách sử dụng JavaScript
- 2. Đặt y [i] biến có thể sửa đổi trong C
- 3. Vẽ một biến thứ ba trên trục x và y
- 4. Chuyển đổi mảng biến thể từ x thành y có thể gây ra ngoại lệ thời gian chạy
- 5. Javascript, tham khảo một biến bằng cách sử dụng một chuỗi có chứa tên của nó?
- 6. Tạo các điểm x và y tương ứng ngẫu nhiên bằng cách sử dụng Numpy
- 7. "Cuối cùng" sẽ làm gì nếu bạn đặt nó trước một biến?
- 8. Đơn giản hóa nếu (x) Một số (y) khác Không có gì?
- 9. Trong PHP là nó có thể sử dụng một chức năng bên trong một biến
- 10. Matplotlib - điểm ghi nhãn (x, y) trên một dòng có giá trị z
- 11. Có trường hợp "[^ xy]" không bằng "(?! X | y)."?
- 12. Nếu bạn thay đổi mã có kiểm tra đơn vị đối với nó, bạn sẽ thay đổi mã nào trước?
- 13. Có điểm nào trong việc sử dụng CHAR nếu bạn có VARCHAR trong cùng một bảng không?
- 14. Tôi có thể viết GEOTIFF bằng Java như thế nào?
- 15. Ruby attr_reader cho phép một biến đổi chuỗi biến đổi nếu sử dụng <<
- 16. Truy cập một biến bằng cách sử dụng một chuỗi có chứa tên biến số
- 17. điều gì sẽ xảy ra nếu bạn sử dụng attribute_to mà không có has_one tương ứng?
- 18. .NET có thể chuyển đổi "Có" & "Không" thành boolean nếu không có Nếu không?
- 19. Có cách nào để chuyển đổi một biến chức năng thành một chuỗi trong D?
- 20. Cách sử dụng matrix.preScale (x, y)
- 21. Làm thế nào để có được đầu ra của curl thành một biến trong Perl nếu tôi gọi nó bằng cách sử dụng backtics?
- 22. Bạn sẽ triển khai một hashtable bằng ngôn ngữ x như thế nào?
- 23. Có thể sử dụng biến công khai trong C# nếu nó là chỉ đọc không?
- 24. Tạo một geotiff từ một bitmap hiện có trong C# với gdal
- 25. Làm thế nào để có được vĩ độ và lâu dài cho một điểm ảnh của một hình ảnh eumetsat bằng cách sử dụng python?
- 26. Có thể chỉnh sửa - Kích hoạt chỉnh sửa X bằng cách nhấp vào Y
- 27. cách các điểm lưới 2d bản đồ (x, y) lên hình cầu như các điểm 3d (x, y, z)
- 28. Có thể tạo một nút bằng cách sử dụng dat.gui
- 29. Làm thế nào để biến 3 phương thức này thành một phương pháp bằng cách sử dụng C# generics?
- 30. chuyển đổi một chuỗi thành một biến thể trong C++
biết thêm thông tin: Tôi hiện có thể chuyển đổi X, Y thành Lat/Lon bằng GeoTransform. – avtoader