2017-08-13 28 views
5

Tôi có một số ranh giới địa lý mà tôi have a GeoJSON endpoint for.Tham gia GeoJSON vào một GeoJSON

Tôi cũng có một số biến được lưu trữ tại GeoJSON endpoint riêng biệt không có tọa độ, nhưng có biến mà tôi muốn sau này theo chủ đề tạo kiểu bản đồ sau này với D3. Điều này được cập nhật hàng tuần.

Có một ID chung trong cả hai câu trả lời được gọi là lga_name (Tên khu vực địa phương của chính phủ) mà tôi đang cố gắng tham gia. Dường như có rất nhiều ví dụ về cách tham gia GeoJSON với một CSV, nhưng không phải GeoJSON với GeoJSON.

Tôi đã bị đâm khi cố gắng put together an app nhưng vẫn gặp khó khăn khi tham gia.

// Load LGAs from ArcGIS Online (The GeoJSON with geoms) 
d3.json("the url to the Geoms", function(error, data) { 

// Load Crash Stats from ArcGIS Online (the total persons involved, summarised down to LGA names) 
d3.json("the url to the table", function(error, data2) { 

     var lga = data.features; 
     var crashStats = data2.features; 

     // Not working 
     var joined = lga.forEach(function(item) { 
      item.properties.LGA_NAME = crashStats[item.properties.lga_name]; 
     }); 

Có thể cho tôi một số gợi ý giúp tôi di chuyển không? Chỉ cần cố gắng tìm hiểu thêm về D3 và Javascript nói chung.

Trả lời

3

Bạn có vấn đề về chất lượng dữ liệu mà sẽ gây ra một số rắc rối:

  1. Names (lga_name) của tính năng này là tất cả các mũ trong một json, nhưng không phải là khác
  2. Tên các tính năng bao gồm ký tự/cụm từ như "(" hoặc "-" hoặc "Lớn hơn" trong một json nhưng không phải là khác.
  3. Có các đối tượng địa lý có tọa độ nhưng không có mục nhập nào trong số khác (Không được hợp nhất Vic)
  4. Dường như có giá trị trùng lặp trong json giữ các thuộc tính phi địa lý (bạn đã nói bạn muốn j oin, không tổng hợp bất kỳ dữ liệu nào, giải pháp của tôi chỉ sử dụng một mục nhập từ thuộc tính json (không có tọa độ))

Bạn có thể đạt được mục tiêu của mình (sử dụng json thứ 2 để nhận được biến mà tôi muốn sau này theo chủ đề phong cách một bản đồ" với) những cách khác nhau, tôi sẽ sử dụng hai phương pháp khác nhau ở đây:

  1. Tạo một GeoJSON hợp lệ nắm giữ tất cả các tính năng và đặc tính
  2. Tạo các tính năng từ các tọa độ json của bạn, và phong cách họ dựa trên các thuộc tính json sử dụng tên như một định danh chung.

Tạo một GeoJSON hợp lệ nắm giữ tất cả các tính năng và đặc tính

của bạn Sử dụng d3.map() chúng ta có thể thêm các thuộc tính của json phi địa lý một cách dễ dàng:

var lookup = d3.map(data.features, function(d) { return d.properties.lga_name; }); 

geographic.features.forEach(function(d) { 
    d.properties = lookup.get(d.properties.LGA_NAME).properties; 
}); 

Bây giờ bạn có một GeoJSON có các thuộc tính của một json, và các tọa độ của một cái khác.

Vì số nhận dạng của bạn không được chuẩn hóa, tôi đã tạo một hàm để chuẩn hóa tên giữa hai tệp để làm cho dữ liệu hoạt động. Tôi cũng đã thêm một kiểm tra để đảm bảo rằng các thuộc tính tồn tại cho một tính năng nhất định. Xem này block.

Tạo tính năng Với Một JSON và Phong cách Dựa trên JSON khác

Bạn không cần phải thực sự tham gia vào các dữ liệu mặc dù để đạt được phong cách.Sử dụng d3.map() bạn có thể tra cứu các thuộc tính của từng tính năng khi tạo kiểu. Ví dụ: bạn có thể tạo kiểu cho phù hợp với:

var lookup = d3.map(data.features, function(d) { return d.properties.lga_name; }); 

regions.attr("fill",function(d) { 
    return color(lookup.get(d.properties.LGA_NAME).properties.total_pers); 
    }) 

Một lần nữa, vì số nhận dạng của bạn không được chuẩn hóa, tôi đã tạo một hàm để chuẩn hóa tên giữa hai tệp. Như trên, cũng có một kiểm tra để xem có một tính năng trong json không địa lý (và do đó các thuộc tính để sử dụng với kiểu dáng). Xem phần này block.

+0

Cảm ơn rất lớn. Điều này sẽ giúp tôi trên đường. Đây là một công việc tự học, và tôi có thể tìm thấy hai nguồn dữ liệu khác nhau sạch sẽ hơn. – Simon

Các vấn đề liên quan