Hơn

Sử dụng GeoServer làm nguồn lớp vectơ trong OpenLayers 3


Tôi đang sử dụng PostGIS và GeoServer và OpenLayers 3 (OL3). Tôi đã kết nối bảng PostGIS với GeoServer và xuất bản lớp của mình. Tôi đang sử dụng mã sau để lấy lớp làm lớp vectơ:

var vector = new ol.layer.Vector ({source: new ol.source.GeoJSON ({chiếu: 'EPSG: 4326', url: 'http: // localhost: 8000 / geoserver / cite / ows? service = WFS & version = 1.0.0 & request = GetFeature & typeName = cite: myfeaturesTbl & maxFeatures = 50 & outputFormat = application / json & '})});

Tôi cần đọc đối tượng địa lý của mình dưới dạng lớp vectơ vì tôi muốn chọn chúng và sau đó lấy thông tin của từng đối tượng địa lý hoặc di chuyển chúng trên bản đồ. Khi tôi sử dụng mã này, nó không hiển thị bất cứ điều gì.

Có vấn đề gì trong mã của tôi không?

Bạn có thể giúp tôi lấy một lớp vectơ trong OL3 với GeoServer WFS không?


Vấn đề nằm ở việc bạn sử dụngurl, mà trong OL3 dường như chỉ mong đợi tệp tĩnh, I E.url = "/static/data/geojson.json".

Để lấp đầy bản đồ của bạn với dữ liệu được tải động, hãy sử dụng lệnh gọi ajax vàol.source.Vector.add Tính năngphương pháp:

var vectorSource = new ol.source.GeoJSON ({chiếu: 'EPSG: 4326'}), $ .get ('/geoserver/cite/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=cite:myfeaturesTbl&maxFeatures=50&outputFormat=applicationputFormat=applicationputFormat=applicationputFormat=applicationput / json '// hàm gọi lại thành công (dữ liệu) {// trước tiên hãy thêm các tính năng vectorSource.addFeatures (vectorSource.readFeatures (data)); // sau đó hiển thị bản đồ… var map = new ol.Map ({target:'… ', các lớp: [new ol.layer.Tile ({source:…}), new ol.layer.Vector ({source: vectorSource})});});

Trình xem bản đồ nguồn mở được xây dựng bằng React, OpenLayers và GeoServer.

Tôi làm việc cho Quận Simcoe ở Ontario, Canada và chúng tôi đã là một cửa hàng ESRI trong 20 năm qua (Trên Cổng thông tin Premise, nhiều Máy chủ AGS, v.v.) nhưng chi phí cấp phép cho các sản phẩm máy chủ của chúng tôi đã tăng lên đáng kể. Vì vậy, Giám đốc của tôi đã giao nhiệm vụ cho tôi cố gắng xây dựng lại ứng dụng web công khai hiện có của chúng tôi trong Nguồn mở. Nó & # x27s hiện được xây dựng trên API JS 3.x bằng cách sử dụng WAB - Web App Builder.

Sau một số nghiên cứu, tôi đã sử dụng React, OpenLayers, GeoServer và PostGres DB. Tôi đã lấy một thẻ từ WAB và thiết kế cùng một loại khuôn khổ cho phép các nhà phát triển mở rộng nó với các thành phần của riêng họ và tải chúng dựa trên cấu hình (Công cụ và Chủ đề).

Ứng dụng KHÔNG hoàn chỉnh nhưng sẽ có trước năm 2020. Ở đó & # x27s đủ để bạn có thể hiểu thiết kế / khái niệm. Tôi đã đăng những gì tôi có ngay hôm nay trên GitHub, cũng như các dự án hỗ trợ (Phản hồi, WebAPI, v.v.). Tôi thực sự hy vọng rằng những người trong số các bạn đang làm việc trong các cửa hàng của ESRI sẽ thấy những gì & # x27s có thể có trong OpenSource. Thành thật mà nói, tôi đã uống ESRI Kool-Aid trong suốt sự nghiệp của mình và khiến bản thân tôi ngạc nhiên về điều này.

Tôi hy vọng ai đó thấy điều này hữu ích hoặc thậm chí hình dung ra việc sử dụng điều này trong tổ chức của riêng họ. Mọi phản hồi / câu hỏi đều được chào đón.


11.1. Cài đặt và cấu hình¶

Ứng dụng web GeoServer nên được cài đặt như một anh em của Metacat. Nếu bạn KHÔNG muốn chạy GeoServer, việc triển khai có thể bị bỏ qua, nhưng bất kỳ giao diện nào sử dụng bản đồ sẽ không hiển thị chính xác. (LƯU Ý: Geoserver khuyên bạn nên sử dụng cài đặt không gian PermGen ít nhất 128MB.).

Metacat đi kèm với một thư mục dữ liệu được cấu hình sẵn để GeoServer sử dụng. Điều này bao gồm lớp cơ sở các quốc gia trên thế giới và cấu hình mặc định đã nhận biết được bộ nhớ đệm không gian của Metacat. Giao diện cấu hình Metacat được sử dụng để cấu hình GeoServer sử dụng thư mục dữ liệu được chia sẻ này. Để định cấu hình thêm GeoServer, hãy sử dụng tiện ích cấu hình dựa trên Web, có sẵn tại: http://your.server.com/<geoserver_context> (ví dụ: http://knb.ecoinformatics.org/geoserver).

Các tác vụ cấu hình phổ biến bao gồm:

  • Thêm Bản đồ vào Trang Web hoặc Giao diện
  • Định cấu hình kích thước và phạm vi ban đầu của bản đồ
  • Định cấu hình bố cục của giao diện ánh xạ HTML
  • Định cấu hình menu thả xuống “Chọn vị trí
  • Định cấu hình chân dung trực quan của dữ liệu không gian địa lý (ví dụ: ký hiệu và màu sắc)
  • Thêm các tập dữ liệu không gian khác vào bản đồ web

Giao diện quản trị dựa trên Web của GeoServer.

Lưu ý: Một số cấu hình cũng có thể cần được thực hiện cho các tệp XML.

OpenLayers, mà Metacat sử dụng làm giao diện người dùng cho dịch vụ WMS của GeoServer, cung cấp các thành phần giao diện hoặc "tiện ích" (ví dụ: bản đồ, thu phóng hộp, danh sách lớp, menu thả xuống "Chọn Vị trí", thanh tỷ lệ, vĩ độ / kinh độ tọa độ và biểu mẫu truy vấn) giúp dễ dàng triển khai các ứng dụng lập bản đồ dựa trên web với mã hóa tối thiểu.

OpenLayers có ba tệp cấu hình chính được sử dụng để tùy chỉnh giao diện bản đồ. Cấu hình mặc định là:

Tài liệu Địa điểm Sự miêu tả
Tệp vị trí đã đặt tên Location.jsp Danh sách các vị trí được xác định trước (tên và giới hạn vĩ độ / kinh độ)
Các chức năng kết xuất bản đồ chính maps.js Xác định bản đồ, vật dụng và hành vi của chúng
Bản đồ được kết xuất và bố cục trang map.jsp Tải bản đồ và kiểm soát bố cục HTML của các tiện ích.

LƯU Ý: Theo mặc định, trong lần khởi động lại Metacat đầu tiên, Metacat sẽ tạo ra một “bộ nhớ đệm không gian” chứa thông tin địa lý về các tài liệu trong kho lưu trữ của nó. Hành vi mặc định này được chỉ định trong lib / metacat.properties, trong đó tham số tái tạoCacheOnRestart được đặt thành true. Thông tin trong bộ đệm ẩn không gian được lưu trữ ở định dạng tương thích với GIS (ESRI Shapefile) và bao gồm tên tài liệu và phạm vi địa lý của nó. Khi các tài liệu được chèn, xóa và cập nhật trong kho lưu trữ Metacat, Metacat sẽ tự động đồng bộ bộ đệm không gian để phản ánh các thay đổi. Bởi vì việc tạo bộ nhớ cache có thể mất một khoảng thời gian đáng kể (vài phút trong trường hợp có vài nghìn tài liệu), Metacat đặt lại thuộc tính refreshCacheOnRestart thành false sau khi bộ nhớ đệm không gian đã được tạo. Lưu ý rằng nếu bạn nâng cấp hoặc cài đặt lại Metacat, bộ đệm không gian sẽ được tạo lại.

11.1.1. Thêm Bản đồ vào Trang Web hoặc Skin¶

Để thêm bản đồ vào một trang Web, chỉ cần bao gồm giao diện bản đồ bằng cách sử dụng iframe:

URL bản đồ, /metacat/style/common/spatial/map.jsp, là giao diện bản đồ mặc định. Nếu bạn định tùy chỉnh giao diện bản đồ, hãy sao chép tệp map.jsp vào thư mục skin của bạn (thư mục skin mặc định hoặc tùy chỉnh).

Bạn có thể truy cập bản đồ tùy chỉnh bằng URL: /metacat/style/skins/<myskin>/spatial/map.jsp

11.1.2. Cấu hình kích thước và phạm vi ban đầu của bản đồ

Trước khi bạn định cấu hình kích thước và phạm vi ban đầu của bản đồ, hãy đảm bảo rằng bạn đã sao chép trang bố cục bản đồ vào thư mục giao diện của mình (Xem Định cấu hình Metacat để biết chỉ đường). Sau khi tệp đã được sao chép, bạn có thể sửa đổi phạm vi ban đầu của bản đồ trong: $/spatial/map.jsp.

Để thay đổi phạm vi ban đầu của bản đồ, hãy chỉnh sửa hộp giới hạn. Mặc định là hiển thị toàn bộ hình ảnh địa cầu. Hàm initMap () cũng nên được đặt tên da để kết quả tìm kiếm không gian có thể được tạo kiểu chính xác.

Kích thước (chiều cao / chiều rộng) của bản đồ có thể được kiểm soát bởi mục nhập CSS #map có trong trang map.jsp.

11.1.3. Cấu hình bố cục của giao diện ánh xạ HTML¶

Kích thước và phạm vi ban đầu của bản đồ có thể được chỉnh sửa trong: $/spatial/map.jsp.

Map.jsp là một vùng chứa đơn giản có thể được đưa vào các trang khác phức tạp hơn nếu muốn. Nó chứa bản đồ, vật dụng và danh sách vị trí thả xuống.

11.1.4. Định cấu hình Menu thả xuống “Chọn vị trí ”¶

Các vị trí xuất hiện trong menu thả xuống "Chọn vị trí" được chỉ định trong tệp vị trí.jsp. Các location.jsp có thể được sao chép từ mẫu không gian chung vào thư mục skin của bạn. Mỗi vị trí được xác định là một thẻ HTML & ltoption / & gt. Chỉnh sửa giá trị và nhãn để chỉnh sửa hoặc thêm vị trí mới.

11.1.5. Định cấu hình Chân dung Trực quan của Dữ liệu Không gian Địa lý (ví dụ: ký hiệu và màu sắc) ¶

Tập dữ liệu không gian địa lý được tạo kiểu thông qua việc sử dụng Bộ mô tả lớp được tạo kiểu (SLD). SLD mặc định được sử dụng cho các điểm dữ liệu và hộp giới hạn dữ liệu nằm trong / lib / spatial / geoserver / data / styles / và được đặt tên là data_points_style.sld và data_bounds_style.sld, tương ứng.

Bạn có thể tìm thấy hướng dẫn chi tiết hơn về cách sử dụng SLD với GeoServer trong tài liệu GeoServer:

11.1.6. Thêm các tập dữ liệu không gian khác vào bản đồ web¶

Nếu bạn có tập dữ liệu GIS vectơ, chẳng hạn như thông tin thời tiết hoặc địa hình, trên máy chủ của mình mà bạn muốn đưa vào bản đồ tương tác, trước tiên bạn phải đăng ký tập dữ liệu với GeoServer. Sau khi tập dữ liệu đã được đăng ký, bạn có thể thêm lớp vào bản đồ. Bạn cũng có thể thêm các lớp không gian đã được cung cấp công khai thông qua WMS (Có hàng trăm bộ dữ liệu không gian có sẵn. Hãy xem wms-sites.com để có danh mục tốt). Hướng dẫn thêm các lớp có sẵn công khai được bao gồm ở cuối phần này.

Để đăng ký tập dữ liệu và thêm nó vào bản đồ:

  1. Trỏ trình duyệt của bạn đến http: //your.server/geoserver, đăng nhập vào GeoServer và điều hướng đến trang cấu hình "Data Stores" trong Data & gt Stores.
  2. Tạo nguồn dữ liệu vectơ mới từ Shapefile trong không gian làm việc “metacat”.

Tạo một shapefile mới bằng giao diện quản trị dựa trên web GeoServers.

  1. Mô tả, nếu được chỉ định, hầu hết được sử dụng nội bộ để cung cấp cho các quản trị viên khác thông tin về DataStore. Nhấp vào Gửi.
  2. Điều hướng đến trang cấu hình "Lớp" trong Lớp dữ liệu và gt. Thêm một Lớp mới từ nguồn dữ liệu mới của bạn.
  3. Bạn cũng nên xác định số hệ thống tham chiếu không gian (SRS) cho lớp mới. Hầu hết dữ liệu vĩ độ / dài là “4326”. Nếu dữ liệu của bạn nằm trong một phép chiếu khác, hãy xác định hệ quy chiếu không gian của nó bằng cách sử dụng các liên kết trợ giúp được cung cấp.

Cấu hình GeoServer’s FeatureType. Các cài đặt SRS được thảo luận trong bước 5 được tô sáng.

  1. Tạo kiểu cho lớp bằng cách sử dụng một kiểu từ menu thả xuống trên tab Xuất bản hoặc tạo SLD mới để tạo một đối tượng kiểu mới và SLD tương ứng (tùy chọn này cung cấp nhiều quyền kiểm soát hơn đối với kiểu).
  2. Hãy thử tập dữ liệu được tạo kiểu dưới dạng lớp WMS bằng cách sử dụng Bản xem trước lớp.

GeoServer’s Layer Preview cho phép bạn xem kết xuất OpenLayer của lớp mới.

  1. Sao chép tệp map.js mặc định tập hợp bản đồ trong OpenLayers (style / common / spatial / map.js) vào thư mục không gian của skin của bạn.
  2. Chỉnh sửa phương thức init () để đưa lớp mới của bạn vào bản đồ - dưới dạng lớp phủ hoặc lớp cơ sở.
  3. Trỏ trình duyệt của bạn đến giao diện bản đồ. Lớp mới của bạn sẽ xuất hiện cùng với những lớp hiện có.

11.1.7. Thêm dữ liệu không gian bên ngoài được cung cấp công khai thông qua WMS¶

Có hàng trăm nguồn dữ liệu không gian được cung cấp công khai thông qua WMS (xem http://wms-sites.com để có danh mục tốt). Để thêm các nguồn dữ liệu này vào bản đồ của bạn, hãy thêm các lớp trong tệp spatial / map.js của da bạn.


Indemaps.com/blog

Tôi rất vui vì những ngày này đang thực hiện ít Flash hơn và phát triển nhiều JavaScript hơn. Đặc biệt, tôi đang điều tra hai nền tảng lập bản đồ web JavaScript mã nguồn mở: một cũ, OpenLayers và một mới, Polymaps.

OpenLayers đã xuất hiện được một thời gian, nhưng vẫn hoạt động tốt như một khung bản đồ trơn trượt trong khi cho phép tùy chỉnh bản đồ theo chủ đề dễ dàng. Polymaps là một thương hiệu mới (từ Stamen, vì vậy bạn biết nó sẽ khiến bạn mất hứng thú), nhưng rất đáng chú ý khi cho phép tùy chỉnh theo chủ đề dựa trên tiêu chuẩn web của các lớp địa lý được tải qua GeoJSON hoặc KML trên & # 8220vector được hiển thị bằng SVG & # 8221.

Trong bài đăng này, tôi chỉ ra cách có thể sử dụng OpenLayers hoặc Polymaps để tạo các bản đồ liên tiếp động và có thể tùy chỉnh với rất ít mã.

Trên đây là bản đồ về ảnh hưởng bầu cử của tiểu bang từ năm 2007 bởi thời báo New York

Tôi đã viết về những người bạn gái này trước đây. Biểu mẫu liên quan đến việc thay đổi kích thước các đối tượng địa lý (như tiểu bang hoặc quốc gia) liên quan đến các giá trị thuộc tính của đơn vị trong một trường nhất định (thường là dân số). Không giống như dạng phổ biến hơn, liền kề của biểu đồ, các biểu đồ không liền kề không cố gắng duy trì cấu trúc liên kết, nhưng do đó miễn phí để duy trì hình dạng hoàn hảo và thử nghiệm với Chức vụ, như trong ví dụ trên.

Dưới đây là một ví dụ từ bài báo gốc năm 1976 của Judy Olson về dạng bản đồ họa này.

Xem bài đăng cũ hơn của tôi hoặc bài viết của Olson để biết thêm thông tin về kỹ thuật và lý thuyết đằng sau nó. Olson đã tạo ra hình ảnh trên bán thủ công bằng máy chiếu & # 8212 mỗi trạng thái được chiếu ở một hệ số tỷ lệ chính xác và sau đó được theo dõi. Dưới đây tôi chỉ ra cách thực hiện nhiều hơn hoặc ít hơn điều tương tự, nhưng với JavaScript và OpenLayers hoặc Polymaps.

Thực hiện

Tôi muốn có thể tải trong bất kỳ tệp dữ liệu địa lý đa giác nào (được hỗ trợ bởi khung lập bản đồ web đã chọn) và thay đổi kích thước của các đối tượng địa lý dựa trên bất kỳ thuộc tính số nào để tạo thành một bản đồ liền kề. Lợi thế của việc triển khai điều này trong khuôn khổ lập bản đồ web rõ ràng là các lớp dữ liệu bổ sung từ nhiều nguồn khác nhau có thể dễ dàng bị thừa hoặc thiếu.

Là một thử nghiệm và bằng chứng về khái niệm cho cả hai khuôn khổ, tôi muốn tái tạo đồ họa của Olson (ở trên) tốt nhất có thể. Olson đã sử dụng dữ liệu Điều tra dân số năm 1970 để hiển thị số người từ 65 tuổi trở lên theo tiểu bang. Tôi đang cập nhật dữ liệu này với dữ liệu ước tính năm 2009. Cụ thể, tôi sẽ tải lớp dữ liệu Geocommons này được tải lên vào năm ngoái.

Tôi đã làm việc với OpenLayers khoảng nửa năm nên tôi đã triển khai bản đồ ở đó trước.

OpenLayers

Việc triển khai các bản đồ không liền mạch trong OpenLayers khá đơn giản, nhờ vào các phương pháp hữu ích được cung cấp bởi khung toàn diện này. Bước đầu tiên là tải dữ liệu địa lý.

Tải dữ liệu địa lý

OpenLayers giúp tải dữ liệu địa lý khá dễ dàng, thư viện có thể phân tích cú pháp WKT, GML, KML, GeoJSON, GeoRSS, v.v. Đối với tất cả, chúng tôi sẽ sử dụng lớp Layer.Vector. Trong trường hợp này, tôi sẽ tải phiên bản KML từ Geocommons và do đó trình phân tích cú pháp Format.KML của OpenLayer.

Các bản đồ liền kề không yêu cầu phép chiếu địa lý & # 8212 bất kể hình chiếu của đường vẽ ban đầu, các đối tượng địa lý vẫn có thể được thu nhỏ chính xác để tạo thành bản đồ. Vì vậy, lý do duy nhất để chiếu là tính thẩm mỹ và để tăng cường khả năng nhận biết của các tính năng. Tôi không chắc Olson đã sử dụng phép chiếu nào, nhưng tôi chỉ xem xét Khu vực bằng Albers cổ điển cũ đó. Cụ thể, tôi đã sử dụng Proj4js và định nghĩa sau:

Proj4js.defs ["MY_ALBERS"] = & # 8220 + proj = aea + lat_1 = 32 + lat_2 = 58 + lat_0 = 45 + lon_0 = -97 + x_0 = 0 + y_0 = 0 + ellps = WGS84 + datum = WGS84 + đơn vị = m + no_defs & # 8221

Để áp dụng nó, tôi chỉ cần tạo một OpenLayers.Projection mới sẽ được áp dụng cho bản đồ khi nó được khởi tạo. Thematicmapping.org có thêm thông tin về các phép chiếu và OpenLayers.

Trừ khi bạn đã biết giá trị lớn nhất của bất kỳ thuộc tính nào mà bạn đang ánh xạ, bạn sẽ phải lặp lại tất cả chúng một lần trước khi có thể lặp lại chúng để chia tỷ lệ. Các thuộc tính có thể truy cập thông qua thuộc tính thuộc tính của mỗi OpenLayers.Feature.Vector (có thể truy cập thông qua thuộc tính tính năng của OpenLayers.Layer.Vector).

Quy mô các tính năng

Để chia tỷ lệ một đối tượng đa giác cho một bản đồ không liền kề, chúng ta phải biết:

  1. giá trị của đối tượng địa lý cho thuộc tính chủ đề đã chọn (xem ở trên)
  2. khu vực và trung tâm của đối tượng địa lý như được hiển thị

OpenLayers làm cho chúng dễ dàng truy cập. Đối tượng hình học của mỗi đối tượng địa lý có các phương thức getArea và getCentroid. Theo như tôi có thể nói, hàm getCentroid trả về tâm khối lượng đa giác thực chứ không chỉ là tâm của hộp giới hạn của đối tượng địa lý.

mong muốnArea = (giá trị / maxValue) * maxArea

wishScale = Math.sqrt (mong muốnArea / originalArea)

Sau đó, tỷ lệ này được áp dụng thông qua phương pháp thay đổi kích thước hình học của từng đối tượng địa lý.

feature.geometry.resize (wishScale, centroid)

Kết quả

Đây là hình ảnh từ ví dụ bạn có thể tìm thấy trên trang này. Tất cả các nguồn chỉ có thể được truy cập từ đó.

Này, trông khá tuyệt. Michigan hơi lệch tâm, nhưng tôi tin rằng đó là vì đa giác chỉ được xác định bởi một vành tọa độ, mặc dù nó phải là một đa giác. Có lẽ đáng chú ý hơn cả là sự trùng lặp ở vùng Đông Bắc. Trong ví dụ ban đầu của Judy Olson, các trạng thái được thổi lên bằng máy chiếu trực quan và sau đó được theo dõi. Nhưng máy chiếu có thể được nhắm trước khi theo dõi, do đó tránh được sự chồng chéo. Trong trường hợp này, tôi chỉ đơn giản là chia tỷ lệ các trạng thái và giữ chúng ở mức trung tâm ban đầu của chúng.

Tôi có thể tránh chồng chéo bằng cách xác định vị trí thích hợp và đặt điều này trong OpenLayers (nhưng chồng chéo sẽ rất khó xác định và sau đó xử lý động) hoặc bằng cách giảm đáng kể diện tích tối đa có thể định cấu hình cho phép trên bản đồ kết quả (nhưng để đảm bảo bạn việc ngăn chặn các tính năng chồng chéo sẽ phải được thu nhỏ lại khá nhỏ, điều này sẽ làm giảm khả năng đọc của bản đồ).

Polymaps

Polymaps là một thư viện ánh xạ JavaScript khá mới của Stamen và SimpleGeo. Geocommons gần đây đã giới thiệu Polymaps cho dịch vụ lập bản đồ trực tuyến của họ, tạo ra một công cụ lập bản đồ chuyên đề trực tuyến không có Flash khá mạnh mẽ. Việc tạo các bản đồ không liền mạch trong Polymaps khó hơn một chút so với quy trình được nêu chi tiết ở trên, chỉ vì thư viện quá nhẹ.

Tải dữ liệu địa lý

Bước đầu tiên là khá dễ dàng. Đối với các định dạng dữ liệu địa lý vectơ, Polymaps chỉ có hỗ trợ tích hợp cho GeoJSON, mặc dù chúng cung cấp một ví dụ KML tận dụng phương pháp tìm nạp tùy chọn được chỉ định trong phương thức khởi tạo lớp GeoJSON.

Nhưng tôi sẽ chỉ sử dụng GeoJSON cho cái này. Tôi phát hiện ra trong bài đăng này từ GeoIQ rằng tôi có thể truy cập phiên bản GeoJSON của các tính năng trong bất kỳ tập dữ liệu Geocommons nào bằng cách truy cập điểm cuối & # 8220features.json & # 8221. Vì vậy, đối với tập dữ liệu điều tra dân số ước tính năm 2009 của tôi, tôi sẽ tải trong http://geocommons.com/overlays/55629/features.json?geojson=1 bằng phương pháp đơn giản sau:

Lưu ý rằng tải trực tiếp từ Geocommons chỉ hoạt động trong khi phát triển cục bộ do chính sách tên miền chéo. Vì vậy, trong ví dụ hoàn chỉnh của tôi, tôi kết thúc việc tải phiên bản cục bộ của JSON.

Polymaps bị giới hạn trong phép chiếu Web Mercator để hiển thị, nhưng chúng tôi vẫn có thể tạo bản sao chép có thể chấp nhận được từ bản gốc của Olson.

Như trong ví dụ OpenLayers ở trên, trừ khi bạn đã biết giá trị lớn nhất của thuộc tính của mình, trước tiên bạn cần phải lặp lại các tính năng để xác định nó. Trong đoạn mã trên, bạn có thể thấy tôi đang sử dụng phương thức của lớp để lắng nghe sự kiện & # 8220load & # 8221. Và trong đó, tôi có thể lấy các tính năng của mình ra khỏi thuộc tính tính năng của đối tượng sự kiện. Các thuộc tính được lưu trữ trên từng thuộc tính data.properties của mỗi tính năng.

Quy mô các tính năng

Để chia tỷ lệ từng đối tượng, trước tiên chúng ta phải biết giá trị của nó trong thuộc tính đã chọn (xem ở trên). Sau đó, chúng tôi cần xác định khu vực hiện tại của nó (tính bằng pixel) để tìm ra khu vực mong muốn của đối tượng địa lý trên bản đồ cuối cùng. OpenLayers cung cấp một phương pháp thuận tiện cho việc này nhưng trong Polymaps, chúng tôi phải tự mày mò vì điều này Mike Bostock (một trong những tác giả chính của Polymap) đã giúp ích rất nhiều. Để tính toán diện tích của từng đối tượng, tôi chỉ cần truy cập vào danh sách các tọa độ hình chiếu (sau đó tôi có thể sử dụng kỹ thuật cơ bản được trình bày chi tiết tại đây). Ông Bostock đã chỉ cho tôi thuộc tính pathSegList của giao diện SVGPathElement. PathSegList hiển thị danh sách các đoạn đường dẫn với giao diện SVGPathSeg. Mike cho biết tôi có thể tin tưởng vào các phân đoạn này là một trong các loại & # 8220M & # 8221 (chuyển tới), & # 8220L & # 8221 (dòng tới) hoặc & # 8220Z & # 8221 (dòng cuối). Với thông tin này, tôi nhanh chóng tập hợp một phương pháp sẽ trả về vùng dự kiến ​​của bất kỳ SVGPathElement nào mà Polymaps có thể tạo ra.

function getPathArea & # 40 segList & # 41
{
var area = 0
var seg1, seg2
var nPts = segList. số hạng mục

// hãy xem mục cuối cùng có phải là 'Z' không (nó phải là)
var lastLetter =
segList. getItem & # 40 nPts - 1 & # 41. pathSegTypeAsLetter
if & # 40 lastLetter. toLowerCase & # 40 & # 41 == 'z' & # 41
nPts -
var j = nPts - 1
segItem_list:
cho & # 40 var i = 0 i & lt nPts j = i ++ & # 41
{
seg1 = segList. getItem & # 40 i & # 41
seg2 = segList. getItem & # 40 j & # 41
khu vực + = seg1. x * seg2. y
khu vực - = seg1. y * seg2. NS
}
khu vực / = 2
trả về Toán. vùng cơ bụng & # 40 & # 41
}

Tôi có thể dễ dàng tạo một phương pháp centroid tương tự, nhưng tôi lười và quyết định chỉ sử dụng chính giữa hộp giới hạn của mỗi tính năng (có thể truy cập thông qua phương thức getBBox của mỗi phần tử SVG).

Diện tích và quy mô mong muốn được tính toán giống như chúng tôi đã làm ở trên trong OpenLayers:

mong muốnArea = (giá trị / maxValue) * maxArea
wishScale = Math.sqrt (mong muốnArea / originalArea)

Sau đó, tỷ lệ được áp dụng thông qua thuộc tính & # 8216transform ’của mỗi phần tử SVG, cả tỷ lệ và bản dịch x-y phải được xác định trong thuộc tính & # 8216transform’:

Kết quả

Như trước đây, đây là hình ảnh được chụp từ ví dụ mà bạn có thể tìm thấy trên trang này. Bạn sẽ thấy một chút mã ở đó, nhưng vui lòng & # 8216xem nguồn 'để xem tất cả mã và đánh dấu.

Ngoài sự khác biệt cần thiết của phép chiếu, điều nổi bật chính là sự trùng lặp ở phía Đông Bắc. Tôi đã thảo luận về các cách có thể để tránh điều này trong ví dụ OpenLayers ở trên.

Sự kết luận

Không có gì ở đây là mới. Tôi đã làm việc này trong Flash được một thời gian & # 8212 xem ở đây và ở đây và tất nhiên Judy Olson đã làm việc này cách đây khoảng 35 năm. Nhưng thật tuyệt khi thấy nó hoạt động linh hoạt trong một vài thư viện mã nguồn mở, tuân thủ các tiêu chuẩn web. Cảm ơn OpenLayers, Polymaps và Geocommmons đã làm cho nó trở nên khả thi!

8 bình luận

Bạn có thể làm điều tương tự bằng cách sử dụng SLD và một bộ lọc Java đơn giản bằng GeoServer. Xem http://ian01.geog.psu.edu/geoserver/www/cartogram/discontinous.html để biết ví dụ và chi tiết.

Bạn có gỡ liên kết đầu tiên đến máy chủ để thử nghiệm không? Chúng tôi có thể kiểm tra ở đâu khác hoặc có hướng dẫn về cách thiết lập môi trường này cục bộ và kiểm tra không?

Một câu hỏi khác. Làm thế nào để thiết lập một môi trường để kiểm tra và chạy điều này? cảm ơn

Xin chào cảm ơn vì sự hướng dẫn của bạn về bài đăng này, nó thực sự hữu ích, chúng tôi đã cố gắng tìm kiếm thông tin trong một thời gian và điều này rất tốt cho chúng tôi để hiểu, tìm kiếm một chiếc radio phù hợp với những gì chúng tôi cần không phải là đơn giản. Cảm ơn một lần nữa

Viết nhiều hơn, đó là tất cả những gì tôi phải nói. Theo nghĩa đen, có vẻ như bạn đã dựa vào video để đưa ra quan điểm của mình. Bạn chắc chắn biết mình đang nói về điều gì, tại sao lại lãng phí trí tuệ của mình vào việc chỉ đăng video lên trang web của bạn khi bạn có thể mang lại cho chúng tôi điều gì đó thú vị để đọc?

Văn bản chắc chắn rất mạnh mẽ và rất có thể là lý do tại sao tôi cố gắng bình luận. Tôi không làm cho nó trở thành một thói quen thường xuyên để làm điều đó. Thứ hai, mặc dù tôi có thể dễ dàng nhận thấy một bước nhảy vọt trong lý do bạn đưa ra, nhưng tôi không thực sự tự tin về cách bạn dường như kết nối các chi tiết của mình, điều này giúp bạn đưa ra kết luận Hiện tại, chắc chắn tôi sẽ đăng ký vào vị trí của bạn, tuy nhiên mong muốn trong tương lai gần, bạn kết nối các dữ kiện của mình tốt hơn nhiều.

Chúng tôi không nói cụ thể khu vực bạn sẽ có dữ liệu của mình, vì đã nói rằng chủ đề có lợi. Tôi cần phải mất một thời gian để làm chủ nhiều hơn cũng như nhận ra bổ sung. Cảm ơn bạn về thông tin tuyệt vời Tôi đang tìm kiếm những chi tiết này cho mục tiêu của mình.

Chỉ tò mò nếu bạn đã thử điều gì đó đơn giản hơn - lập chỉ mục các giá trị mà bạn muốn hiển thị trong biểu đồ để trạng thái có giá trị lớn nhất là 100% (tức là vẫn giữ nguyên kích thước hiện tại) và điều chỉnh tất cả các trạng thái khác theo tỷ lệ phần trăm tương đối với cơ sở này, sau đó lưu vào bộ đệm hướng nội? Các tiểu bang có tỷ lệ phần trăm nhỏ nhất có thể biến mất, nhưng có thể sẽ duy trì vị trí và không có sự chồng chéo khiến bạn đang giảm kích thước. Nhưng có thể nếu có sự khác biệt lớn giữa các giá trị cao nhất / thấp nhất, tôi đoán có thể chỉ hiển thị một trạng thái và tất cả các trạng thái khác đều biến mất & # 8230become miniscule & # 8230?

5 Trackbacks

[. ] indemaps.com/blog »Các bản đồ không liền nhau trong OpenLayers và Polymaps indemaps.com/blog/2011/02/noncontiguous-cartograms-in-openlayers-and-polymaps/ & ndash xem trang & ndash đã lưu vào bộ nhớ cache. Tôi rất vui khi làm ít Flash hơn và ngày nay JavaScript phát triển nhiều hơn. Đặc biệt, tôi đang điều tra hai nền tảng lập bản đồ web JavaScript mã nguồn mở: một cũ, OpenLayers và một mới, Polymaps. Chỉ hiển thị có ảnh hưởng (1) $ ('# filter-infonly'). Change (function () else >) [. ]

[. ] tuyệt vời kỳ quái, còn điều này thì sao? Các bản đồ không liền kề trong OpenLayers và Polymaps 1. OpenLayers + Polymaps 2 là sự kết hợp thành công. Chúa phù hộ cho Ian Turton vì đã đẩy một [. ]

[. ] Các bản đồ không liền kề trong OpenLayers và Polymaps [. ]

[. ] Tôi đã xem qua tác phẩm của anh ấy ba năm trước, và không bao giờ có chuyện làm hài lòng chúng tôi bằng việc viết blog về một số bản hack thú vị bằng cách sử dụng API của chúng tôi. Tôi rất vui mừng được tham gia nhóm phát triển GeoIQ với tư cách là Kỹ sư trực quan hóa. Các [. ]

[. ] đã thấy OL được sử dụng để lập bản đồ chuyên đề trong các ứng dụng biểu tượng choropleth và tỷ lệ vào năm 2008. Tôi đã thêm các bản đồ không liền kề vào hỗn hợp cuối cùng [. ]


GeoServer 2.17.3 đã phát hành

Chúng tôi vui mừng thông báo về việc phát hành GeoServer 2.17.3 với các bản tải xuống (war | bin), tài liệu và phần mở rộng.

Bản phát hành này được thực hiện cùng với GeoTools 23.3 và GeoWebCache 1.17.3. Đây là bản phát hành bảo trì được khuyến nghị cho các hệ thống sản xuất.

Cảm ơn tất cả những người đã đóng góp và Alessandro Parma, Andrea Aime (GeoSolutions) đã thực hiện bản phát hành này.

Cải tiến và sửa chữa

Bản phát hành này bao gồm một số cải tiến. Cải tiến đáng chú ý:

  • SLDService hiện có thể quảng cáo các phương pháp phân loại được hỗ trợ (cho các ứng dụng khách kiểm tra trong tương lai, trong trường hợp các phương pháp mới được thêm vào sau này). Một phương pháp phân loại dựa trên độ lệch chuẩn mới đã được thêm vào.
  • Giờ đây, lược đồ ứng dụng tạo ra các đầu ra tính năng đơn giản (ánh xạ thuần túy) cũng có thể được sử dụng với tất cả các định dạng tính năng đơn giản phổ biến, như shapefile, CSV, KML, v.v.
  • Có thể tắt tính năng tự động hoàn tất đăng nhập giao diện người dùng
  • Trình nhập đã được tối ưu hóa để tránh quét toàn bộ thư mục trong khi nhập các tệp đơn lẻ. Điều này cùng với các tối ưu hóa tương tự trong thu thập khảm ảnh, tăng tốc độ thu thập đáng kể các tệp mới thông qua trình nhập, khi được chứa trong các thư mục có nhiều tệp.
  • Đầu ra ô vectơ giờ đây có thể nhận được đầy đủ lợi ích từ nguồn dữ liệu được tổng quát hóa trước, đọc các tính năng ở độ phân giải cần thiết để tạo ô vectơ (trước đây sử dụng độ phân giải cao nhất hiện có).
  • Quá trình Jiffle chuyển đổi / kết xuất hiện có thể tạo ra các đầu ra đa băng tần và hiệu suất của nó đã nhận được một số cải tiến.

Các bản sửa lỗi được bao gồm trong bản phát hành này:

  • Quản lý bộ nhớ của các nguồn GDAL raster đã được cải thiện.
  • Xem trước lớp với tuân thủ WMS nghiêm ngặt đã không còn hoạt động nữa, điều này đã được khắc phục.

Để biết thêm thông tin, hãy kiểm tra ghi chú phát hành 2.17.3.

Cập nhật cộng đồng

Đối với các nhà phát triển xây dựng từ nguồn, mô-đun cộng đồng của chúng tôi là một nơi tuyệt vời để cộng tác về chức năng và cải tiến.


Cách kết nối SAP HANA với GeoServer

Trong khi đó, SAP HANA và các đặc điểm không gian của nó có thể được sử dụng với rất nhiều công cụ GIS (Hệ thống thông tin địa lý) của bên thứ ba. Một câu hỏi quan trọng là làm thế nào để kết nối SAP HANA với các công cụ này. Điều này có thể khá khác nhau giữa các công cụ và đôi khi cũng là một loại thông tin ẩn, đặc biệt là khi khả năng và hỗ trợ cho một công cụ nào đó là mới và gần đây. Trong blog này, tôi đi vào chi tiết cách kết nối SAP HANA với GeoServer.

SAP HANA có thể được sử dụng trong GeoServer làm kho lưu trữ dữ liệu. http://docs.geotools.org/latest/userguide/library/jdbc/hana.html mô tả theo nghĩa nào đó rằng điều này là có thể. Chúng tôi sẽ cung cấp thông tin chi tiết trong blog này về môi trường MS Windows 10 và GeoServer 2.15.0.

Triển khai Trình cắm HANA cho GeoServer: Truy cập https://mvnrepository.com/artifact/org.geotools.jdbc/gt-jdbc-hana/21.0 và nhấp vào nút ngay bên cạnh & # 8220Files & # 8221 để tải xuống tệp gt-jdbc-hana-21.0.jar.

Sao chép tệp gt-jdbc-hana-21.0.jar vào thư mục & # 8230 GeoServer 2.15.0 webapps geoserver WEB-INF lib của cài đặt GeoServer.

Thực hiện điều này cũng là HANA JDBC ngdbc.jar trình điều khiển phải được sao chép vào cùng một thư mục.

Bạn có thể tìm ngdbc.jar trong danh bạ C: Program Files SAP hdbclient cài đặt hdbclient cho môi trường của bạn.

Sau khi thực hiện xong việc này, hãy khởi động lại máy chủ geoServer và bạn sẽ tìm thấy SAP HANA là nguồn dữ liệu vectơ có thể có trong Máy chủ địa lý trong Cửa hàng & # 8211 & gt Thêm cửa hàng mới:

Xác định nguồn dữ liệu vectơ cho SAP HANA: Chúng tôi sẽ chỉ mô tả các tham số kết nối với cơ sở dữ liệu HANA khi tạo một cửa hàng trong GeoServer. Điều kiện tiên quyết là bạn cũng cần phải có một không gian làm việc. Để biết chi tiết về cách tạo không gian làm việc và hướng dẫn chung cho GeoServer, hãy xem ví dụ: https://geoserver.geo-solutions.it/edu/en/.

Trong môi trường nhiều đối tượng thuê, bạn phải nêu tên của cơ sở dữ liệu đối tượng thuê và số phiên bản ở cuối mặt nạ mục nhập. Hãy nhớ rằng cách khác, nó KHÔNG hoạt động khi sử dụng SQL-Port của đối tượng thuê tương ứng và để trống cơ sở dữ liệu. Cổng trường là bắt buộc, nhưng nó không được xem xét. Các thông số kết nối còn lại phải khá rõ ràng.

Trong ví dụ này, cơ sở dữ liệu đối tượng thuê của tôi được gọi là SPL và có một lược đồ cơ sở dữ liệu được gọi là HACKT25.

Bây giờ bạn có thể tạo một lớp mới trong GeoServer qua Lớp & # 8211 & gt Thêm một lớp mới và kiểm tra chéo những gì bạn thấy ở đây với những gì bạn có trong cơ sở dữ liệu HANA từ xa của mình.

Kết luận, chúng ta thấy rằng các phần chính là tìm nơi tải xuống trình cắm Hana phù hợp và thứ hai là tìm ra những gì được yêu cầu bởi các thuộc tính kết nối của kho dữ liệu trong GeoServer.


Lớp Vector và IE

Sử dụng Javascript OpenLayers từ mô-đun OpenLayers có thể gây ra một số vấn đề với việc hiển thị các lớp vectơ trong IE.

Nguyên nhân gốc rễ của vấn đề:

Internet Explorer có một thứ gọi là VML: Vector Markup Language, nó sử dụng để vẽ đồ họa. VML là những gì bạn sử dụng trong IE: canvas4ie rất chậm, bản đồ google sử dụng VML để vẽ các tuyến đường và OpenLayers sử dụng nó để vẽ các vectơ.

Các phần tử VML được tạo kiểu bằng cách tạo kiểu giống như CSS trong một không gian tên. OpenLayers tạo không gian tên ol: và sau đó tạo các kiểu như ol: line ol: circle, v.v.

Để làm điều này, nó phải truy cập document.namespaces. Document.namespaces không phải lúc nào cũng có mặt: đáng chú ý là bạn không thể phụ thuộc vào nó có trước document.ready.

Tuy nhiên, đôi khi document.namespaces * xuất hiện trước document.ready và đó là thứ đã làm xáo trộn thế giới quan của tôi. Vì vậy, lý thuyết là, có các chế độ. Một cái gì đó trong HTML có thể ngăn document.namespaces được điền trước document.ready.

$ (hoặc $ (tài liệu) .ready ()

  • Nếu có một hình ảnh bị hỏng trên trang, thì không gian tên sẽ không được điền vào.
  • Nếu trang không có hình ảnh bị hỏng, thì có thể truy cập document.namespaces

Document.load ()

31 bảng định kiểu

IE không thể xử lý nhiều hơn 31 bảng định kiểu trên một trang cùng một lúc. Đây rõ ràng là
công việc của ma quỷ, nhưng nó vẫn tồn tại ngoài IE8. Nếu có 31 bảng định kiểu và bạn chạy một
Bản đồ OpenLayers, nó không thể thêm một biểu định kiểu khác để khởi tạo không gian tên VML của nó.
Do đó, bản đồ bị vỡ. Bạn phải tổng hợp CSS của mình.

Khắc phục

Chúng tôi không thể di chuyển các lớp mở sang document.load () vì nó phụ thuộc vào ngăn xếp các hành vi Drupal, chạy trên document.ready (). Chúng ta chỉ cần xác định document.namespaces trước khi OpenLayers hỏi trình kết xuất VML của nó liệu trình duyệt hiện tại có khả năng hiển thị VML hay không (một nhiệm vụ mà nó cố gắng hoàn thành bằng cách gọi !! (document.namespaces))

Other Fixes

Adding a tag <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> will allow IE8 to render vectors if it doesn't render them correctly on a normal pageload. Note that this must be the first element inside the header tag.


Layers and GeometryEncoders

The primary type that defines a collection of geometries is the Layer. A layer contains an index for querying. In addition a Layer can be an EditableLayer if it is possible to add and modify geometries in the layer. The next most important interface is the GeometryEncoder.

The DefaultLayer is the standard layer, making use of the WKBGeometryEncoder for storing all geometry types as byte[] properties of one node per geometry instance.

The OSMLayer is a special layer supporting Open Street Map and storing the OSM model as a single fully connected graph. The set of Geometries provided by this layer includes Points, LineStrings and Polygons, and as such cannot be exported to Shapefile format, since that format only allows a single Geometry per layer. However, OMSLayer extends DynamicLayer, which allow it to provide any number of sub-layers, each with a specific geometry type and in addition based on a OSM tag filter. For example you can have a layer providing all cycle paths as LineStrings, or a layer providing all lakes as Polygons. Underneath these are all still backed by the same fully connected graph, but exposed dynamically as apparently separate geometry layers.


WMS/WMTS protocol and configuration improvements

Creating new styles from templates

It’s now possible to create new styles starting from the built-in templates, and the style will be encoded in the desired style language (SLD, or CSS, or even something else, if you created your own styling language extension point):

GeoWebCache filter parameters GUI improved

It’s now possible to configure integer parameters in the caching section of a layer configuration.

GeoWebCache Storage

GeoWebCache can now store cached tiles on a perlayer basis - including Amazon S3.

Request parameter support in Freemaker templates

Freemarker GetFeatureInfo templates can now access to the request parameter, as well as the Java process environment variables, in order to customize their response. For example, it’s now possible to expand the following variables in the template:

Controlling interpolation on a layer by layer basis

You can now control layer interpolation via GetMap, and specify a different interpolation policy on different layers. This is great if you are serving multiple raster maps, and maybe you want to have your classified raster use nearest neighbor, while showing the ozone density layer with bilinear interpolation.

Inspire configuration improved


GeoServer

The GeoServer team is happy to announce the GeoServer 2.15.0 release with downloads (zip|war|exe), documentation (html|pdf) and extensions.

This release is production ready and is ready to work with your Java 8 or Java 11 operational environment. This release is made in conjunction with GeoWebCache 1.15.0 and GeoTools 21.0.

The ability to work with Java 11 is the result a dedicated code sprint. Thanks to organizations participating in the code sprint (Boundless, GeoSolutions, GeoCat, Astun Technology, CCRi) along with sprint sponsors (Gaia3D, atol, osgeo:uk, Astun Technology).

Layer Service Settings

To start things off an often requested capability, the ability to control which services are enabled on a layer-by layer basis.

To try it our yourself see Service Settings in our user manual.

GeoFence Internal Server Extension

Originally a standalone service offering fine grain control over GeoServer security this functionality has been packaged up and embedded into a GeoServer extension for easier deployment.

  • GeoFence rules provided greater control over security allowing layer by layer service restrictions
  • GeoFence rules can provide access to data overriding layer details including CQL filter to limit contents returned and default style used for rendering
  • GeoFence rules can limit access to a geographic extent

For more details see GeoFence Internal Server in our user manual.

Style Editor SLD Auto-Complete

To help make editing easier the Style Editor can provide auto-complete suggestions for SLD 1.0. To try it out yourself use control-space for context aware suggestions.

Generate Classified Thematics maps

SLDService is now an official extension, with a number of improvements. SLDService can now be used for the

  • classification of raster data too
  • equal area classification
  • standard deviation filtering

The SLD REST Service extension is used to generate thematic styles based on attribute data:

For more information see SLD Rest Service in our user manual.

WPS GetExecutionStatus and Dismiss Operations

WPS “GetExecutions” vendor operation allows each user to get the list of running processes:

The Dismiss vendor operation can be used to cancel the execution of one of the listed processes.

For more information see Dismiss in our user guide.

Java 11 Support

The provided binary download works with either Java 8 or Java 11. Tomcat 9 or newer is required for the WAR install. The user guide compatibility list will continue to be updated based on your feedback.

The java ecosystem is now being led by the open source OpenJDK project, with long term support available from a range of organizations notably RedHat OpenJDK and Adopt OpenJDK. The GeoTools user guide provides an overview of Java 8 and Java 11 distributions.

The net effect of these changes:

  • If you have been using Oracle JDK please review your options
  • Java 8 will continue to be available
  • The Java ecosystem is now led by the open-source Open JDK project

Java 11 no longer supports the Java 2 extension mechanism used for native JAI and native ImageIO libraries. We recommend the use of the pure Java JAI-EXT operations which have been made the default (see the next section).

JAI-EXT operations on by default

The use of the JAI-EXT operations have long been a recommendation, with this release we are making them the default for GeoServer. The JAI-EXT library offers a pure java implementation enhanced for geospatial functionality supporting NODATA pixels and support for vector footprints.

GeoServer Codebase

In addition to Java 11 support this release includes:

  • Add JSON as a Legend Output format (GISP 173)
  • Printing plugin upgrade version of JTS
  • Upgrade NetCDF dependencies
  • Improvements for vector tile production, both in terms of output correctness and production performance

Thanks to Andrea Aime for steady work on the codebase quality:

    source code analysis, high priority checks, will fail the build in case of issues byte code analysis, same as above
  • Many small bugs fixed

For more details developers are invited to review Automated Quality Assurance checks in our developers manual. Also, work in ongoing on the master (dev) branch to extend the reach of static code checks using SpotBugs and CheckStyle too.


Xem video: Openlayers 6 Tutorial #7 - Vector Layers (Tháng MườI 2021).