Tôi đã tìm kiếm một giải pháp vững chắc cho phép tôi tạo một bản đồ web và đa giác vector mà không mất thời gian để tải dữ liệu đó với mục tiêu cho phép tôi làm cho mỗi đa giác hiển thị một màu khác nhau trên một sự kiện di chuột.
Theo như tôi biết, có 3 tùy chọn cụ thể để đạt được điều này thông qua canvas, SVG, Flash.
Flash có vẻ như sẽ là giải pháp tốt nhất nếu nó hoạt động trên apple iphones / ipad vì nó dường như cung cấp kết xuất nhanh nhất và hiển thị sạch nhất. Canvas dường như là lựa chọn tốt thứ hai nhưng mất nhiều thời gian nếu bạn có hàng trăm đa giác được hiển thị trên bản đồ trong khi SVG thậm chí còn mất nhiều thời gian hơn để kết xuất.
Tôi gần như mất hy vọng trong việc tìm giải pháp cho vấn đề này nhưng hôm nay tôi tình cờ gặp một công ty có tên là GISCloud http://www.giscloud.com (hiện đang trong giai đoạn thử nghiệm với đăng ký miễn phí).
Công ty này đã SOMEHOW quản lý để tìm ra một cách tuyệt vời để hiển thị hàng trăm vectơ trên bản đồ trong thời gian gần. Tôi đã rất ngạc nhiên với cách tiếp cận của họ và câu hỏi của tôi đối với cộng đồng liên quan đến cách chúng ta có thể sao chép cách tiếp cận của họ để sử dụng với các công nghệ hiện có như tờ rơi, tờ mở, sáp ...
Hãy tự mình xem bằng cách xem bản demo tuyệt vời này: http://www.giscloud.com/map/284/africa
Hãy chắc chắn rằng bạn di chuột qua bất kỳ đa giác nào trên trang và kiểm tra các điều khiển thu phóng để thấy rằng các đa giác này thực sự là vectơ.
Những gì tôi đã nhận thấy bằng cách xem xét các yêu cầu với fireorms là bản đồ đang yêu cầu các tệp json cụ thể. Có vẻ như tùy thuộc vào mức / mức thu phóng, có nhiều tệp json được yêu cầu.
Tôi cũng nên đề cập ở đây rằng một khi giscloud tải dữ liệu trên trang di chuột qua một vectơ ngay lập tức thay đổi màu sắc mà không tạo yêu cầu mới.
VÍ DỤ:
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/4/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/4.json
Tôi giả sử cấu trúc url tuân theo logic dịch vụ ốp lát tiêu chuẩn (ví dụ: thư mục thứ 3 đến thư mục cuối cùng là mức thu phóng ...).
Trong mọi trường hợp, tôi đã phân tích dữ liệu thực tế của các tệp json này và có vẻ như logic họ đang sử dụng tuân theo một số loại logic mà họ tạo ra các vectơ của họ chỉ dựa trên các giá trị dữ liệu này:
- chiều rộng / chiều cao: chúng xác định chiều rộng và chiều cao của dữ liệu được phục vụ trong mỗi yêu cầu json
- pixel: ở đây họ xác định các giá trị pixel mà tôi giả sử bằng cách nào đó liên quan đến một số tọa độ pixel x / y chung cho các mức điểm tổng quát? Tôi đoán rằng bằng cách nào đó họ có cách tự động đơn giản hóa khu vực tùy thuộc vào mức thu phóng. Tôi giả sử họ sử dụng tọa độ pixel Tôi đoán rằng họ đang giảm đáng kể kích thước của dữ liệu cần được tải so với dữ liệu lat / long.
- kiểu: ở đây họ xác định hai giá trị css RGB. "F" đại diện cho màu tệp đa giác và "S" đại diện cho màu viền đa giác.
- geom: đây là nơi tôi đoán họ bằng cách nào đó xác định cụ thể xác định từng đa giác trong ô đang được tải trong đó dữ liệu đó được xác định dựa trên cửa sổ chứa bản đồ. Điều thú vị nữa là mỗi mục nhập có một giá trị "S" mà tôi giả sử được sử dụng làm thuộc tính tùy chọn hoặc giá trị liên kết tính năng và ở cuối mỗi mục ở đây có một khu vực dường như xác định một ID vector cụ thể cùng với ID lớp mà tôi đoán được sử dụng để bằng cách nào đó tham gia dữ liệu từ mỗi yêu cầu gạch json được gọi.
Tôi cũng giả định rằng bằng cách nào đó họ đã tìm ra cách tự động xác định và phân tách dữ liệu cần được tải cho mỗi ô tùy thuộc vào kích thước của dữ liệu cần được tải cho ô được yêu cầu.
Dưới đây là phân tích trích xuất của một trong những yêu cầu sau:
{"width":256,"height":256,"tile":
{"pixels":
[0,6461,-1,0,5,148,0,509,-1,10715,-1,1,-1,251,-1,1,-1,1,-1,251,-2,3,-1,255,-1,249,-2,5,-2,247,-1,509,-3,251,-1,2,-2,253,-2,252,-2,254,-1,255,-1,254,-1,255,-1,1276,-2,13,-1,233,-1,2,-1,253,-1,1,-1,255,-1,247,-1,1306,-1,1533,-1,1269,-1,1276,-1,2303,-1]},
"styles":
[{"f":"rgb(99,230,101)","s":"rgb(5,148,0)","lw":"0"}],
"geom":
[
{"s":0,"p":[4,143,5,144,3,146,1,146,2,143,4,143],"c":"layer1156_5098"},
{"s":0,"p":[-2,143,0,140,2,141,2,144,1,146,-2,144,-2,143],"c":"layer1156_5067"},
{"s":0,"p":[7,143,5,144,4,143,2,143,2,141,5,138,6,139,5,141,7,143],"c":"layer1156_5051"},
{"s":0,"p":[10,141,11,137,12,137,14,137,12,142,9,143,9,142,10,141],"c":"layer1156_5041"},
{"s":0,"p":[1,136,0,140,-2,143,-2,136,1,136],"c":"layer1156_5038"},
{"s":0,"p":[8,143,5,141,5,137,8,136,10,137,10,141,8,143],"c":"layer1156_5033"},
{"s":0,"p":[5,137,2,141,0,140,1,136,1,136,2,135,3,136,5,137],"c":"layer1156_5028"},
{"s":0,"p":[10,134,12,136,11,138,8,135,10,134],"c":"layer1156_5020"},
{"s":0,"p":[-2,133,0,136,-2,136,-2,133],"c":"layer1156_5005"},
{...}
...
]
}
Làm thế nào chúng ta có thể sao chép cùng một loại tốc độ (hoặc tương tự) bằng cách sử dụng postgis (mà tôi dường như cũng đang sử dụng)?