OpenLayers dengan server data OSM saya sendiri


9

Saya telah melalui proses pengaturan basis data OSM / server ubin saya sendiri dengan mengatur PostGIS, mengimpor snapshot data Planet.osm (perlu beberapa hari), dan mengatur Mapnik / cascadenik, dll. Saya dapat secara manual membuat sendiri ubin sampel dengan generate_image.pydan saya dapat secara manual menghasilkan ubin dengan generate_tiles.py. Saya telah menghabiskan banyak waktu untuk menghasilkan template gaya kustom saya sendiri menggunakan cascadenik dan menghasilkan ubin darinya, yang saya cukup senang dengannya.

Masalah baru saya adalah menyiapkan sampel peta slippy dengan OpenLayers untuk dijalankan di server yang sama ...

Saya sudah mengaturnya dan berfungsi; setup Apache, mod_python, TileCache, dll. Ini merender ubin ke dalam slippy map, tapi saya pikir saya punya semua parameter yang kacau di OpenLayers. Inilah yang saya dapatkan saat ini (yang menjadikan apa yang tampak seperti lautan kosong di semua level zoom):

<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>

Saya merasa ada sesuatu yang salah dengan parameter opsi lapisan, tetapi saya tidak dapat menemukan dokumentasi yang baik menjelaskan parameter standar yang akan digunakan untuk menampilkan ubin OSM umum yang dibuat oleh Mapnik ...

Adakah sesuatu yang jelas bahwa saya hilang yang akan menyebabkan masalah ini?

Ini semua yang saya miliki di tilecache.cfg, juga:

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

Jawaban:


8

Satu catatan: Saya merekomendasikan mod_wsgi di atas mod_python. Dan penting untuk menggunakan prefork Apache dengan mod_python atau (idealnya) mod_wsgi dalam mode daemon dengan utas = 1 dan proses = N (di mana N paling cocok dengan jumlah prosesor logis). mod_wsgi dalam mode daemon dapat digunakan dengan prefork atau pekerja Apache. Alasan untuk ini adalah bahwa TileCache cache objek mapnik.Map dan karenanya tidak boleh dibagikan di seluruh utas. Inti Mapnik sepenuhnya threadsafe, tetapi aplikasi server multithreaded perlu membuat instance objek mapnik.Map per utas. Mod_tile dan Paleoserver adalah contoh aplikasi yang mendukung rendering multithreaded dengan cara ini, tetapi TileCache tidak mendukung ini. Namun, menjalankan mode daemon TileCache + Mapnik + mod_wsgi dengan utas = 1 adalah rute yang bagus,

Sejauh konfigurasi layer Anda, coba tambahkan "serviceVersion":

var tms = new OpenLayers.Layer.TMS ("TileCache Mapnik Layer", url, {serviceVersion: "1.0.0", layername: "osm", ketik: "png"});


Terima kasih! Itu memperbaiki masalah, tetapi sekarang setCenter tidak berfungsi - Saya pikir itu akan ke tingkat zoom yang benar, tetapi berpusat di ll = (0, 0) (di luar Afrika) ... Mungkin masalah dengan meter vs Desember . derajat? Juga, terima kasih atas sarannya re: mod_wsgi. Saya akan mengaturnya dan melihat apakah saya bisa mendapatkan kinerja yang lebih baik. Saya menjalankan di VM dengan 6 core dan 12 GB RAM, jadi itu harus banyak untuk beberapa rendering / caching cepat.
colemanm

2
Koordinat OSM dalam meter, jadi Anda harus mengatur pusat dalam meter yang diproyeksikan. Lihat docs.openlayers.org/library/… .
Christopher Schmidt

Terima kasih, sepertinya itu adalah masalah saya - saat menggunakan setCenter dengan coords dalam meter berfungsi.
colemanm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.