Làm cách nào để có được vĩ độ / kinh độ trong Độ phút thứ hai (DMS) bằng máy tính trường QGIS?


9

Tôi đã đưa ra biểu thức sau đây để chuyển đổi 5.1234 thành 5 ° 7`24.24 "

toint ($ x) || '°' || toint ((($ x) - toint ($ x)) * 60) || '`' | | chất nền ((chuỗi (((($ x) - toint ($ x)) * 60) - toint ((($ x) - toint ($ x)) * 60)) * 60), 1,5) || '"'

Đây là vấn đề: đối với một số điểm như 5.1234, nó hoạt động. nhưng đối với những người khác, nó không. Tôi nghi ngờ vấn đề là chuyển đổi số nguyên làm tròn các số thập phân thay vì cắt bớt nó.

Có lựa chọn nào khác? cảm ơn.


Tôi có thể đề nghị một cách giải quyết. Không tối ưu, nhưng nếu bạn bị mắc kẹt ngay bây giờ, bạn có thể hoàn thành công việc của mình. Nhấp chuột phải và Lưu dưới dạng CSV. Mở CSV trong Excel hoặc Google Docs, nhập công thức của bạn (công cụ này sẽ sạch hơn và dễ dàng hơn). Xóa tất cả các trường ngoại trừ một mã định danh duy nhất và chuỗi DMS được chuyển đổi. Lưu nó Thực hiện một bảng tham gia với lớp hiện có và bạn đã được thiết lập.
mặc dù không gian

1
Hãy cẩn thận với đầu vào tiêu cực.
whuber

Chỉ cần thêm vào câu trả lời của không gian: làm tròn xuống mức độ gần nhất sẽ hoạt động trong Excel bằng hàm FLOOR ().
Micha

Câu trả lời:


3

Tôi thích biểu thức bạn đã kết hợp với nhau - có lẽ không có giải pháp nào trong QGIS 1.8, nhưng trong QGIS 1.9-dev có floor()chức năng làm tròn số làm tròn xuống . Dành cho D ° M'S '':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || floor(((abs($x)) - floor (abs($x))) * 60) ||'\'' || substr( (tostring((((abs($x)) - floor (abs($x))) * 60) - floor(((abs($x)) - floor (abs($x))) * 60)) * 60),1,5) || '"'

Lưu ý dấu nháy thoát ( \').

Đối với D ° M.MMM ':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || ((abs($x) - floor(abs($x))) * 60) ||'\''

Để giới hạn số phút thập phân được hiển thị, thay thế # trong biểu thức bên dưới bằng số chữ số:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'

Vì tò mò, công thức sẽ như thế nào đối với Độ, Phút?
chùy

Đã thêm một ví dụ; cái này hoạt động trong QGIS 2.6 (và có thể là bất cứ thứ gì 2.0 trở lên) nhưng có thể có nhiều chức năng định dạng thanh lịch hơn hiện có.
Simbamangu

1
Chỉ một cạm bẫy: Công thức của bạn chỉ hoạt động cho các giá trị tích cực của Easting và Northing. Tiêu cực là một quá nhỏ. Và tôi tự hỏi làm thế nào 0,5 ° E và 0,5 ° W có thể được phân biệt. sàn (+/- 0,5) sẽ luôn là 0, không phải -0.
AndreJ

Aaargh. Những cạm bẫy của việc kiểm tra không đầy đủ ... và đây cũng là tôi làm việc ở bán cầu nam (âm tính). Cập nhật ngắn gọn.
Simbamangu

1

Toán tử modulo có thể được sử dụng để thực hiện cắt ngắn, nhưng biểu thức kết quả sẽ rất xấu. Việc sử dụng thay thế chuỗi là tốt hơn, nhưng thật không may, QGIS không để lộ bất kỳ chức năng strpose hoặc tương tự nào. Sử dụng regexp_replace($x, '\\..*', '')để có được toàn bộ phần và regexp_replace($x, '^[0-9]*\\.', '')để có được phần thập phân. Sử dụng torealthay vì tointtính toán với biểu thức thứ hai để đảm bảo sẽ không có làm tròn.


2
Không có chức năng strpose nhưng hiện tại;) github.com/qgis/Quantum-GIS/commit/ mẹo
Nathan W

tsk tsk tsk, rất nhiều tiếng ồn khoảng trắng.
lynxlynxlynx

Vâng, bỏ qua bit đầu tiên, nó chỉ là một chút dọn dẹp không liên quan đến chức năng mới.
Nathan W

Xấu xí là ... sẽ cố gắng giải quyết nó.
Obsidianz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.