OpenLayers พร้อมเซิร์ฟเวอร์ข้อมูล OSM ของฉันเอง


9

ฉันได้ผ่านขั้นตอนการตั้งค่าฐานข้อมูล OSM ของฉันเอง / เซิร์ฟเวอร์ไทล์ด้วยการตั้งค่า PostGIS นำเข้าภาพรวมข้อมูล Planet.osm (ใช้เวลาสองสามวัน) และตั้งค่า Mapnik / cascadenik ฯลฯ ฉันสามารถแสดงผลด้วยตัวเอง กระเบื้องตัวอย่างด้วยgenerate_image.pyและผมเองสามารถผลิต tilesets generate_tiles.pyกับ ฉันใช้เวลาพอสมควรในการสร้างเทมเพลตสไตล์ของฉันเองโดยใช้ cascadenik และสร้างไทล์จากมันซึ่งฉันมีความสุขมาก

ปัญหาใหม่ของฉันคือการตั้งค่าแผนที่ลื่นตัวอย่างกับ OpenLayers ให้ทำงานบนเซิร์ฟเวอร์เดียวกัน ...

ฉันได้รับมันค่อนข้างกำหนดค่าและทำงาน; เซ็ตอัพ Apache, mod_python, TileCache และอื่น ๆ มันแสดงผลแบบเรียงต่อกันในแผนที่แบบลื่น แต่ฉันคิดว่าฉันมีพารามิเตอร์ที่ผิดพลาดทั้งหมดใน OpenLayers นี่คือสิ่งที่ฉันได้รับในขณะนี้ (ซึ่งแสดงสิ่งที่ดูเหมือนมหาสมุทรที่ว่างเปล่าในทุกระดับการซูม)

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

ฉันรู้สึกว่ามีบางอย่างผิดปกติกับพารามิเตอร์ตัวเลือกเลเยอร์ แต่ฉันไม่สามารถหาเอกสารที่ดีที่อธิบายถึงพารามิเตอร์มาตรฐานที่จะใช้สำหรับการแสดงไทล์ OSM ทั่วไปที่แสดงโดย Mapnik ...

มีบางอย่างที่ชัดเจนว่าฉันหายไปซึ่งจะทำให้เกิดปัญหานี้หรือไม่?

นี่คือทั้งหมดที่ฉันมีใน tilecache.cfg ด้วย:

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

คำตอบ:


8

One note: ฉันแนะนำ mod_wsgi มากกว่า mod_python และเป็นสิ่งสำคัญที่จะต้องใช้ Apache prefork กับ mod_python หรือ (นึกคิด) mod_wsgi ในโหมด daemon พร้อมกับเธรด = 1 และกระบวนการ = N (โดยที่ N นั้นตรงกับจำนวนตัวประมวลผลเชิงตรรกะที่ดีที่สุด) mod_wsgi ในโหมด daemon สามารถใช้ได้กับ Apache prefork หรือผู้ปฏิบัติงาน เหตุผลนี้คือ TileCache แคชวัตถุ mapnik.Map และไม่ควรใช้ร่วมกันข้ามเธรด Mapnik core เป็น threadsafe อย่างสมบูรณ์ แต่แอปพลิเคชันเซิร์ฟเวอร์ที่มีหลายเธรดต้องสร้างอินสแตนซ์ของวัตถุ mapnik.Map ต่อเธรด Mod_tile และ Paleoserver เป็นตัวอย่างของแอปพลิเคชันที่รองรับการเรนเดอร์แบบมัลติเธรดในลักษณะนี้ แต่ TileCache ไม่รองรับสิ่งนี้ อย่างไรก็ตามการเรียกใช้โหมด TileCache + Mapnik + mod_wsgi daemon พร้อมเธรด = 1 เป็นเส้นทางที่ดี

เท่าที่เลเยอร์ config ของคุณลองเพิ่ม "serviceVersion":

var tms = OpenLayers.Layer.TMS ใหม่ ("เลเยอร์ TileCache Mapnik", url, {serviceVersion: "1.0.0", ชื่อเล่น: "osm", พิมพ์: "png"});


ขอบคุณ! ที่แก้ไขปัญหา แต่ตอนนี้ setCenter ไม่ทำงาน - ฉันคิดว่ามันจะไปถึงระดับการซูมที่ถูกต้อง แต่มันอยู่กึ่งกลางที่ ll = (0, 0) (นอกทวีปแอฟริกา) ... อาจเป็นปัญหากับเมตรและธันวาคม . องศา? นอกจากนี้ขอขอบคุณสำหรับคำแนะนำอีกครั้ง: mod_wsgi ฉันจะตั้งค่าแบบนั้นและดูว่าฉันจะได้ประสิทธิภาพที่ดีขึ้นหรือไม่ ฉันกำลังทำงานใน VM ที่มี 6 คอร์และ RAM ขนาด 12 GB ดังนั้นควรมีมากมายสำหรับการเรนเดอร์ / แคชอย่างรวดเร็ว
colemanm

2
พิกัด OSM อยู่ในหน่วยเมตรดังนั้นคุณจะต้องตั้งค่ากึ่งกลางเป็นเมตรที่คาดการณ์ไว้ ดูdocs.openlayers.org/library/… .
Christopher Schmidt

ขอบคุณดูเหมือนว่าเป็นปัญหาของฉัน - เมื่อใช้ setCenter กับ coords ในหน่วยเมตรใช้งานได้
colemanm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.