Mục lục:

Cách tạo bản đồ cách điệu tùy chỉnh bằng OpenStreetMap: 7 bước (có ảnh)
Cách tạo bản đồ cách điệu tùy chỉnh bằng OpenStreetMap: 7 bước (có ảnh)

Video: Cách tạo bản đồ cách điệu tùy chỉnh bằng OpenStreetMap: 7 bước (có ảnh)

Video: Cách tạo bản đồ cách điệu tùy chỉnh bằng OpenStreetMap: 7 bước (có ảnh)
Video: Inkscape Map Art Tutorial: How to Make Custom Stylized Maps with Free OpenStreetMap Data 2024, Tháng bảy
Anonim
Cách tạo bản đồ cách điệu tùy chỉnh bằng OpenStreetMap
Cách tạo bản đồ cách điệu tùy chỉnh bằng OpenStreetMap

Trong hướng dẫn này, tôi sẽ mô tả một quy trình mà bạn có thể tạo các bản đồ cách điệu tùy chỉnh của riêng mình. Bản đồ cách điệu là một bản đồ trong đó người dùng có thể chỉ định lớp dữ liệu nào được hiển thị, cũng như xác định kiểu mà mỗi lớp được hiển thị. Đầu tiên tôi sẽ mô tả quy trình mà qua đó bạn có thể viết phần mềm để cách điệu bản đồ, tiếp theo là một ví dụ về phần mềm Python mà tôi đã viết để thực hiện tác vụ này.

Video sau đây nêu bật cách cá nhân tôi tạo bản đồ cách điệu, nhưng hãy tiếp tục đọc để biết các chi tiết sâu sắc. Tôi rất háo hức muốn xem những gì cộng đồng tạo ra!

Động lực của tôi đằng sau dự án này là gì?

Thành thật mà nói, tôi bắt đầu dự án này vì tôi nghĩ rằng nó sẽ rất vui khi làm. Ý tưởng này đã quay cuồng trong đầu tôi suốt một năm qua, và cuối cùng tôi đã dành thời gian cần thiết để biến nó thành hiện thực. Sau một ngày tạo mẫu với một số kịch bản cơ bản, tôi đã có thể tạo ra kết quả cực kỳ hứa hẹn - hứa hẹn đến mức tôi biết mình cần phải chính thức hóa các kịch bản của mình để những người khác có thể dễ dàng tạo ra các tác phẩm của riêng họ.

Động lực của tôi khi viết tài liệu hướng dẫn này là do tôi đã tìm thấy rất ít thông tin về cách tạo bản đồ cách điệu của riêng bạn từ đầu. Tôi hy vọng có thể chia sẻ những gì tôi đã học được với cộng đồng.

Tài nguyên / Liên kết:

  • OpenStreetMap
  • OpenStreetMap Legalese
  • Kho lưu trữ Github

Quân nhu

  • Một bản phân phối Python (tôi đã sử dụng Anaconda & Python 3.6)
  • PyQt5 (cho các phụ thuộc GUI)

Bước 1: Xác định quy trình I: Tải xuống tệp OSM

Xác định quy trình I: Tải xuống tệp OSM
Xác định quy trình I: Tải xuống tệp OSM

Khi tôi lần đầu tiên bắt đầu dự án này, câu hỏi khó hiểu nhất là "tôi có thể lấy dữ liệu bản đồ ở đâu." Đương nhiên, như bạn mong đợi, tôi ngay lập tức nghĩ đến Google Maps. Sau khi nghiên cứu quan trọng, tôi phát hiện ra rằng Google thực sự không muốn mọi người sử dụng dữ liệu của họ, theo nghĩa sáng tạo hay cách khác. Trên thực tế, họ rõ ràng không cho phép tìm kiếm web từ Google Maps.

May mắn thay, sự tuyệt vọng của tôi chỉ tồn tại trong thời gian ngắn khi tôi khám phá ra OpenStreetMap (OSM). OSM là một dự án hợp tác liên quan đến mọi người trên toàn cầu đóng góp dữ liệu. OSM cho phép rõ ràng việc sử dụng dữ liệu của họ với tên gọi phần mềm Nguồn Mở. Như vậy, truy cập trang web OSM là nơi bắt đầu hành trình cách điệu bản đồ.

Sau khi đến trang web OSM, nhấp vào tab "Export" để hiển thị các công cụ xuất bản đồ. Bây giờ, hãy phóng to để xem khu vực mà bạn muốn thu thập dữ liệu bản đồ. Chọn liên kết "Chọn một khu vực khác theo cách thủ công", liên kết này sẽ hiển thị một hộp trên màn hình của bạn. Định hình và đặt hộp này trên khu vực quan tâm. Sau khi hài lòng, hãy nhấp vào nút "Xuất" để tải xuống tệp dữ liệu OSM của bạn.

Lưu ý # 1: Nếu vùng đã chọn của bạn chứa quá nhiều dữ liệu, bạn sẽ gặp lỗi vì đã chọn quá nhiều nút. Nếu điều này xảy ra với bạn, hãy nhấp vào nút "Vượt qua API" để tải xuống tệp lớn hơn của bạn.

Lưu ý # 2: Nếu tệp OSM đã tải xuống của bạn lớn hơn 30MB, chương trình Python tôi đã viết sẽ chậm đáng kể. Nếu bạn quyết tâm sử dụng một khu vực rộng lớn, hãy cân nhắc viết kịch bản để loại bỏ những dữ liệu thừa mà bạn không định vẽ.

Bước 2: Xác định Quy trình II: Tìm hiểu Dữ liệu

Xác định quy trình II: Tìm hiểu dữ liệu
Xác định quy trình II: Tìm hiểu dữ liệu
Xác định quy trình II: Tìm hiểu dữ liệu
Xác định quy trình II: Tìm hiểu dữ liệu
Xác định quy trình II: Tìm hiểu dữ liệu
Xác định quy trình II: Tìm hiểu dữ liệu
Xác định quy trình II: Tìm hiểu dữ liệu
Xác định quy trình II: Tìm hiểu dữ liệu

"Tôi có dữ liệu … bây giờ thì sao?"

Bắt đầu bằng cách mở tệp OSM đã tải xuống của bạn vào phần mềm soạn thảo văn bản yêu thích của bạn. Đầu tiên bạn sẽ nhận thấy đây là một tệp XML, thật tuyệt! XML đủ dễ để phân tích cú pháp. Phần đầu tệp của bạn trông gần giống với hình ảnh đầu tiên của bước này - một số siêu dữ liệu và ranh giới địa lý cơ bản sẽ được liệt kê.

Khi cuộn tệp, bạn sẽ thấy ba phần tử dữ liệu được sử dụng xuyên suốt:

  1. Điểm giao
  2. Cách
  3. Quan hệ

Phần tử dữ liệu cơ bản nhất, một nút chỉ đơn giản là có một mã định danh, vĩ độ và kinh độ duy nhất được liên kết với nó. Tất nhiên, có siêu dữ liệu bổ sung, nhưng chúng tôi có thể loại bỏ nó một cách an toàn.

Các cách là tập hợp các nút. Một đường có thể được hiển thị dưới dạng một hình dạng kèm theo hoặc dưới dạng một đường kết thúc mở. Các cách bao gồm một tập hợp các nút được xác định bằng mã định danh duy nhất của chúng. Chúng được gắn thẻ bằng các khóa xác định nhóm dữ liệu mà chúng thuộc về. Ví dụ: cách được mô tả trong hình ảnh thứ ba ở trên thuộc về nhóm dữ liệu "địa điểm" và nhóm con của nó, "đảo". Nói cách khác, cách cụ thể này thuộc về lớp "đảo" dưới nhóm "địa điểm". Các cách cũng có số nhận dạng duy nhất.

Cuối cùng, quan hệ là tập hợp các cách. Một quan hệ có thể biểu diễn một hình dạng phức tạp với các lỗ hoặc nhiều vùng. Các mối quan hệ cũng sẽ có một mã định danh duy nhất và sẽ được gắn thẻ tương tự như các cách.

Bạn có thể đọc thêm về các phần tử dữ liệu này từ OSM wiki:

  • Điểm giao
  • Cách
  • Quan hệ

Bước 3: Xác định quy trình III: Tiêu hóa dữ liệu

Xác định quy trình III: Tiêu hóa dữ liệu
Xác định quy trình III: Tiêu hóa dữ liệu

Bây giờ, ít nhất bạn phải có hiểu biết bề ngoài về các phần tử dữ liệu tạo nên một tệp OSM. Tại thời điểm này, chúng tôi muốn đọc dữ liệu OSM bằng ngôn ngữ bạn chọn. Mặc dù bước này tập trung vào Python, nhưng nếu bạn không muốn sử dụng Python, bạn vẫn nên đọc phần này vì nó chứa một số mẹo và thủ thuật.

Gói xml được bao gồm theo mặc định với hầu hết các bản phân phối Python tiêu chuẩn. Chúng tôi sẽ sử dụng gói này để rất dễ dàng phân tích cú pháp tệp OSM của chúng tôi như được hiển thị trong hình ảnh đầu tiên. Trong một vòng lặp for, bạn có thể xử lý việc xử lý dữ liệu OSM cho từng phần tử dữ liệu cụ thể.

Trên dòng cuối cùng của hình ảnh, bạn sẽ thấy tôi kiểm tra thẻ 'giới hạn'. Bước này cực kỳ quan trọng trong việc dịch các giá trị kinh độ và vĩ độ thành các pixel trên màn hình. Tôi thực sự khuyên bạn nên chạy chuyển đổi này tại thời điểm bạn tải tệp OSM, vì quá trình chuyển đổi dữ liệu hàng loạt là quá trình chuyên sâu.

Nói về việc chuyển đổi vĩ độ và kinh độ sang tọa độ màn hình, đây là một liên kết đến hàm tính toán mà tôi đã viết. Bạn có thể sẽ nhận thấy điều gì đó hơi lạ trong việc chuyển đổi vĩ độ sang tọa độ màn hình. Có một bước bổ sung liên quan khi so sánh với kinh độ! Hóa ra, dữ liệu OSM được mô hình hóa bằng phương pháp chiếu Pseudo-Mercator. May mắn thay, OSM có tài liệu tuyệt vời về chủ đề này ở đây và họ cung cấp các chức năng chuyển đổi vĩ độ cho một số lượng đáng kể ngôn ngữ. Đáng kinh ngạc!

Lưu ý: Trong mã của tôi, tọa độ màn hình (0, 0) là góc trên bên trái của màn hình.

Bước 4: Triển khai Trình tạo kiểu bản đồ Python

Triển khai Trình tạo kiểu bản đồ Python
Triển khai Trình tạo kiểu bản đồ Python
Triển khai Trình tạo kiểu bản đồ Python
Triển khai Trình tạo kiểu bản đồ Python
Triển khai Trình tạo kiểu bản đồ Python
Triển khai Trình tạo kiểu bản đồ Python

Cho đến thời điểm này, tôi đã thảo luận về tệp dữ liệu OSM - nó là gì, cách đọc nó và phải làm gì với nó. Bây giờ tôi sẽ thảo luận về phần mềm tôi đã viết để giải quyết việc hiển thị bản đồ theo phong cách (repo GitHub được cung cấp trong phần giới thiệu).

Việc triển khai cụ thể của tôi tập trung vào quyền kiểm soát của người dùng đối với đường dẫn hiển thị. Cụ thể, tôi cho phép người dùng chọn các lớp mà họ muốn hiển thị và cách họ muốn lớp đó được hiển thị. Như tôi đã đề cập ngắn gọn trước đó, có hai lớp phần tử được hiển thị: điền vào các mục và mục hàng. Điền chỉ được xác định bởi một màu, trong khi các đường được xác định bởi màu, độ rộng dòng, kiểu đường, kiểu nắp dòng và kiểu nối dòng.

Khi người dùng thực hiện sửa đổi đối với kiểu lớp và khả năng hiển thị, những thay đổi được phản ánh trong tiện ích bản đồ ở bên phải. Khi người dùng đã sửa đổi giao diện của bản đồ theo ý của họ, anh ta có thể điều chỉnh kích thước bản đồ tối đa và lưu bản đồ dưới dạng hình ảnh trên máy tính của mình. Khi lưu hình ảnh, tệp cấu hình người dùng cũng sẽ được lưu. Điều này đảm bảo người dùng có thể nhớ lại và sử dụng lại cấu hình mà anh ta đã sử dụng để tạo một hình ảnh cụ thể bất kỳ lúc nào.

Bước 5: Hạn chế thực hiện + Giải pháp

Hạn chế thực hiện + Giải pháp
Hạn chế thực hiện + Giải pháp
Hạn chế thực hiện + Giải pháp
Hạn chế thực hiện + Giải pháp

Khi lần đầu tiên tôi bắt đầu tạo kiểu bản đồ theo cách thủ công, tôi đã biết rằng đây là một quá trình khá tẻ nhạt. Cung cấp cho người dùng quyền kiểm soát tối đa có thể chỉ đơn giản là áp đảo do số lượng lớn các "nút" có sẵn. Tuy nhiên, có một giải pháp đơn giản, bao gồm thêm một chút script.

Tôi bắt đầu bằng cách xác định các lớp mà tôi đặc biệt quan tâm. Với mục đích của hướng dẫn này, giả sử tôi quan tâm nhất đến các tòa nhà (tất cả chúng), sông, đường cao tốc chính và đường phố. Tôi sẽ viết một tập lệnh trong đó tôi tạo một phiên bản Cấu hình, chuyển đổi trạng thái lớp một cách thích hợp bằng cách sử dụng hàm setItemState () và các hằng số được xác định, và đặt màu dựa trên cách tôi muốn các lớp của mình xuất hiện bằng cách sử dụng setValue (). Tệp cấu hình kết quả được lưu có thể được sao chép vào thư mục configs và được tải bởi người dùng.

Một tập lệnh ví dụ có trong hình trên. Hình ảnh thứ hai là một ví dụ về các chức năng trợ giúp trông như thế nào và vì chúng về cơ bản là giống hệt nhau, chỉ với các hằng số khác nhau, tôi chỉ đưa vào một hình ảnh của một ví dụ.

Bước 6: Các khu vực cần cải thiện

Các lĩnh vực cần cải thiện
Các lĩnh vực cần cải thiện

Sau khi phản ánh về việc triển khai phần mềm của mình, tôi đã xác định một số lĩnh vực sẽ là những cải tiến hữu ích cho người dùng thành thạo.

  1. Kết xuất lớp động. Hiện tại, tôi có một danh sách được xác định trước về các lớp sẽ được hiển thị, vậy là xong. Một phần nguyên nhân là do khó khăn trong việc xác định xem một lớp nên là một đường kẻ hay một phần tô. Do đó, với gần như mọi tệp OSM bạn mở, bạn sẽ được chào đón bằng một loạt cảnh báo về các lớp sẽ không được hiển thị. Thường thì những thứ này rất nhỏ nên không phải là vấn đề, nhưng chắc chắn sẽ thiếu các lớp quan trọng. Kết xuất lớp động sẽ loại bỏ những lo lắng này.
  2. Phân công lớp động. Điều này song hành với # 1; nếu bạn muốn hiển thị lớp động, bạn cần gán lớp động (tức là xác định lớp tô so với lớp đường). Điều này có thể được thực hiện một cách hợp lý, như tôi đã học, bởi vì các Cách có nút đầu tiên và nút cuối cùng giống nhau sẽ là các đường dẫn kèm theo và do đó được lấp đầy.
  3. Nhóm màu. Một bản đồ cách điệu thường có nhiều lớp có cùng kiểu và việc cho phép người dùng sửa đổi kiểu của nhóm cùng một lúc sẽ làm giảm đáng kể thời gian của người dùng để chỉnh sửa từng lớp một.

Bước 7: Kết thúc suy nghĩ

Bớt tư tưởng
Bớt tư tưởng
Bớt tư tưởng
Bớt tư tưởng
Bớt tư tưởng
Bớt tư tưởng

Cảm ơn tất cả mọi người đã dành thời gian đọc qua Tài liệu hướng dẫn của tôi. Dự án này là đỉnh cao của nhiều giờ nghiên cứu, thiết kế, lập trình và gỡ lỗi. Tôi hy vọng tôi có thể cung cấp một bệ phóng mà từ đó bạn có thể xây dựng dự án của riêng mình hoặc xây dựng dựa trên những gì tôi đã viết. Tôi cũng hy vọng những thiếu sót và mẹo của tôi cung cấp nhiều điểm cần xem xét trong thiết kế của bạn. Nếu bạn ít có xu hướng lập trình hơn và thiên về tạo ra các tác phẩm nghệ thuật, tôi muốn xem những gì bạn tạo ra trong các nhận xét! Khả năng là vô tận!

Đặc biệt cảm ơn những người đóng góp OpenStreetMap! Những dự án như thế này sẽ không thể thực hiện được nếu không có những nỗ lực đáng kể của họ.

Vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi nào trong phần bình luận!

Thử thách bản đồ
Thử thách bản đồ
Thử thách bản đồ
Thử thách bản đồ

Về nhì trong Thử thách bản đồ

Đề xuất: