OpenLayers với máy chủ dữ liệu OSM của riêng tôi


9

Tôi đã trải qua quá trình thiết lập cơ sở dữ liệu / máy chủ gạch OSM của riêng mình bằng cách thiết lập PostGIS, nhập ảnh chụp nhanh dữ liệu Planet.osm (mất vài ngày) và thiết lập Mapnik / cascadenik, v.v. gạch mẫu với generate_image.pyvà tôi có thể tự sản xuất gạch với generate_tiles.py. Tôi đã dành một lượng thời gian kha khá để tạo mẫu kiểu tùy chỉnh của riêng mình bằng cách sử dụng cascadenik và tạo các ô từ nó, điều mà tôi khá hài lòng.

Vấn đề mới của tôi là thiết lập một bản đồ slippy mẫu với OpenLayers để chạy trên cùng một máy chủ ...

Tôi đã có một số cấu hình và làm việc; thiết lập Apache, mod_python, TileCache, v.v. Nó kết xuất các ô vào bản đồ slippy, nhưng tôi nghĩ rằng tôi đã có tất cả các tham số được vặn trong OpenLayers. Đây là những gì tôi đã có hiện tại (biểu hiện những gì trông giống như đại dương trống ở tất cả các mức thu phóng):

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <script src="http://openlayers.org/api/OpenLayers.js"></script> 
    <script type="text/javascript">
        var map;

        function init() {
                map = new OpenLayers.Map ("map", {
                        maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
                        maxResolution: 156543.0399,
                        numZoomLevels: 19,
                        units: 'm',
                        projection: new OpenLayers.Projection("EPSG:900913"),
                        displayProjection: new OpenLayers.Projection("EPSG:4326")
                } );

                layer = new OpenLayers.Layer.TMS( "OSM", "/tilecache/tilecache.py/", {layername: 'osm', type: 'png'} );
                map.addLayer(layer);
                map.addControl(new OpenLayers.Control.PanZoomBar());
                map.setCenter(new OpenLayers.LonLat(-82.686195, 27.84788), 12)
        }
        </script> 
  </head>
<body onload="init()">
    <div id="map"></div>
</body>
</html>

Tôi cảm thấy có gì đó không đúng với các tham số tùy chọn lớp, nhưng tôi không thể tìm thấy tài liệu tốt mô tả các tham số tiêu chuẩn được sử dụng để hiển thị các ô OSM chung được hiển thị bởi Mapnik ...

Có điều gì đó rõ ràng mà tôi đang thiếu sẽ gây ra vấn đề này?

Đây là tất cả những gì tôi có trong tilecache.cfg, quá:

[cache]
type=Disk
base=/tmp/tilecache
[osm]
type=Mapnik
spherical_mercator=true
mapfile=/home/user/mapfile.xml

Câu trả lời:


8

Một lưu ý: Tôi khuyên dùng mod_wsgi hơn mod_python. Và điều quan trọng là sử dụng prefork Apache với mod_python hoặc (lý tưởng) mod_wsgi trong chế độ daemon với chủ đề = 1 và quy trình = N (trong đó N phù hợp nhất với số lượng bộ xử lý logic). mod_wsgi trong chế độ daemon có thể được sử dụng với prefork hoặc worker của Apache. Lý do cho điều này là vì TileCache lưu trữ đối tượng mapnik.Map và do đó không nên chia sẻ nó qua các luồng. Lõi Mapnik hoàn toàn an toàn cho các luồng, nhưng các ứng dụng máy chủ đa luồng cần tạo một thể hiện của một đối tượng mapnik.Map trên mỗi luồng. Mod_tile và Paleoserver là những ví dụ về một ứng dụng hỗ trợ kết xuất đa luồng theo cách này, nhưng TileCache không hỗ trợ điều này. Tuy nhiên, chạy chế độ daemon của TileCache + Mapnik + mod_wsgi với các luồng = 1 là một tuyến tốt,

Theo cấu hình lớp của bạn, hãy thử thêm "serviceVersion":

var tms = new OpenLayers.Layer.TMS ("TileCache Mapnik Layer", url, {serviceVersion: "1.0.0", tên người dùng: "osm", gõ: "png"});


Cảm ơn! Điều đó đã khắc phục được sự cố, nhưng hiện tại setCenter không hoạt động - Tôi nghĩ rằng nó sẽ ở mức thu phóng chính xác, nhưng nó tập trung ở ll = (0, 0) (ngoài Châu Phi) ... Có thể là sự cố với mét so với dec . độ? Ngoài ra, cảm ơn vì lời khuyên re: mod_wsgi. Tôi sẽ thiết lập theo cách đó và xem liệu tôi có thể có hiệu suất tốt hơn không. Tôi đang chạy trong một máy ảo có 6 lõi và RAM 12 GB, vì vậy nó sẽ rất tốt cho một số kết xuất / lưu trữ nhanh.
colemanm

2
Các tọa độ OSM được tính bằng mét, vì vậy bạn sẽ phải đặt trung tâm theo mét dự kiến. Xem docs.openlayers.org/l Library / .
Christopher Schmidt

Cảm ơn, có vẻ như đó là vấn đề của tôi - khi sử dụng setCenter với coords tính bằng mét, nó hoạt động.
colemanm
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.