2014-02-11 5 views
5

Примечание: Я знаю, что есть еще один вопрос, подобный этому, но на него не ответили, и мне нужно знать, как смешанные проекции можно обрабатывать с помощью GeoJSON и OSM.Проекция с открытыми слоями с картами стиля OSM и векторным слоем GeoJSON

Я так смущен. Я использовал API OSMDroid для Android для сопоставления и хотел реплицировать его с помощью OpenLayers и GeoExt, но у меня есть проблема с проекцией, включая узлы GeoJSON и события действий.

Мой набор плиток основан на OSM и размещен на том же веб-сервере, что и этот HTML/JS. См. Все ниже. Я понимаю, что мои границы не работают, и мои прогнозы могут быть совершенно неправильными. Я тестировал разные комбинации.

Проблема заключается в том, что моя карта отображается правильно и хорошо центрирована. Однако:

  1. Модифицированные узлы GeoJSON находятся вне карты. Они находятся в другой проекции long/lat, но я не знаю, как установить или преобразовать GeoJSON long/lat в текущую проекцию карты.

  2. My mapCtrl не работает. Когда я нажимаю НЕГО lonlat еще одна проекция (проекция OSM Coords), и я не могу показаться, чтобы преобразовать их)

  3. Любые советы о том, как экстентов/границы на самом деле работа была бы весьма признателен

Может кто-то, пожалуйста, помогите с советом по проектам? Вздох ... Я не достаточно терпелив для этого.

enter image description here

Вот мои полные JS, как:

var mapPanel, store, gridPanel, mainPanel, nodePop, mapPop; 

Ext.onReady(function() { 

    var map, mapLayer, vecLayer; 
    var lon = -70.885610; 
    var lat = 38.345822; 
    var zoom = 17; 
    var maxZoom = 18; 

var toProjection = new OpenLayers.Projection("EPSG:4326"); 
var fromProjection = new OpenLayers.Projection("EPSG:900913"); 
    var extent = new OpenLayers.Bounds(-1.32,51.71,-1.18,51.80).transform(fromProjection, toProjection); 

    // Setup the node layer feature store and push it all into a vector layer 
    vecLayer = new OpenLayers.Layer.Vector("vector"); 
    store = new GeoExt.data.FeatureStore({ 
     layer: vecLayer, 
     fields: [ 
      {name: 'name', type: 'string'}, 
      {name: 'status', type: 'string'} 
     ], 
     proxy: new GeoExt.data.ProtocolProxy({ 
      protocol: new OpenLayers.Protocol.HTTP({ 
       url: "data/sa.json", 
       format: new OpenLayers.Format.GeoJSON() 
      }) 
     }), 
     autoLoad: true 
    }); 

    // Setup the basic map layer using OSM style tile retreival to pull tiles 
    // from the same server hosting this service 
    map = new OpenLayers.Map(
     'map', { 
      controls:[ 
       new OpenLayers.Control.Navigation(), 
       new OpenLayers.Control.PanZoomBar(), 
       new OpenLayers.Control.Attribution(), 
       new OpenLayers.Control.ScaleLine()], 
      projection: toProjection, 
      displayProjection: fromProjection, 
      numZoomLevels: 20, 
      fractionalZoom: true 
     }); 

    mapLayer = new OpenLayers.Layer.OSM(
     "Local Tiles", 
     "tiles/${z}/${x}/${y}.png", 
     { 
      zoomOffset: 17, 
      resolutions: [1.194328566741945,0.5971642833709725,0.2985821416854863] // Zoom level 17 - 19 
     }); 

    map.addLayers([mapLayer, vecLayer]); 

    // Create a map panel 
    mapPanel = new GeoExt.MapPanel({ 
      title: "Map", 
      region: "center", 
      map: map, 
      xtype: "gx_mappanel", 
      center: new OpenLayers.LonLat(lon, lat), 
      zoom: zoom 
    }); 

    // Create a grid panel for listing nodes 
    gridPanel = new Ext.grid.GridPanel({ 
      title: "Nodes", 
      region: "east", 
      store: store, 
      width: 275, 
      columns: [{ 
       header: "Name", 
       width: 200, 
       dataIndex: "name" 
      }, { 
       header: "Status", 
       width: 75, 
       dataIndex: "status" 
      }], 
      sm: new GeoExt.grid.FeatureSelectionModel({ 
       autoPanMapOnSelection: true 
       }) 
    }); 

    // Create the main view port 
    new Ext.Viewport({ 
     layout: "border", 
     items: [{ 
      region: "north", 
      contentEl: "title", 
      height: 150 
     }, mapPanel, gridPanel] 
    }); 
    var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); 
    map.setCenter(lonLat, zoom); 


    // Attach all the event driven stuff here... 
    // Create a node selection pop up control 
    function nodeAction(feature) { 
     nodePop = new GeoExt.Popup({ 
      title: 'Node selected', 
      location: feature, 
      width: 200, 
      html: "", 
      maximizable: true, 
      collapsible: true 
     }); 
     nodePop.on({ 
      close: function() { 
       if(OpenLayers.Util.indexOf(vectorLayer.selectedFeatures, this.feature) > -1) { 
        selectCtrl.unselect(this.feature); 
       } 
      } 
     }); 
     nodePop.show(); 
    }; 

    // Attach the pop to node/feature selection events 
    var selectCtrl = new OpenLayers.Control.SelectFeature(vecLayer); 
    vecLayer.events.on({ 
     featureselected: function(e) { 
      nodeAction(e.feature); 
     } 
    }); 

    // Create map selection pop up control 
    function mapAction(lonlat) { 
     mapPop = new GeoExt.Popup({ 
      title: 'Map selected', 
      location: lonlat, 
      width: 200, 
      html: "You clicked on (" + lonlat.lon.toFixed(2) + ", " + lonlat.lat.toFixed(2) + ")", 
      maximizable: true, 
      collapsible: true, 
      map: mapPanel.map, 
      anchored: true 
     }); 
     mapPop.doLayout(); 
     mapPop.show(); 
    }; 

    var mapCtrl = new OpenLayers.Control.Click({ 
     trigger: function(evt) { 
      var lonlat = mapPanel.map.getLonLatFromViewPortPx(evt.xy); 
      lonlat.transform(new OpenLayers.Projection("EPSG:4326"), mapPanel.map.getProjectionObject()); 

      //.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); 

      mapAction(lonlat); 
     } 
    }); 
    mapPanel.map.addControl(mapCtrl); 
    mapCtrl.activate(); 
}); 

// A control to handle user clicks on the map 
OpenLayers.Control.Click = OpenLayers.Class(
    OpenLayers.Control, { 
     defaultHandlerOptions: { 
      single: true, 
      double: false, 
      pixelTolerance: 0, 
      stopSingle: true 
     }, 
     initialize: function(options) { 
      this.handlerOptions = OpenLayers.Util.extend(
       options && options.handlerOptions || {}, 
       this.defaultHandlerOptions 
      ); 
      OpenLayers.Control.prototype.initialize.apply(
       this, arguments 
      ); 
      this.handler = new OpenLayers.Handler.Click(
       this, 
       { click: this.trigger }, 
       this.handlerOptions 
      ); 
     }, 
     CLASS_NAME: "OpenLayers.Control.Click" 
    } 
); 

Вот GeoJSON я использую:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "geometry": { 
     "type": "Point", 
     "coordinates": [ 
      -70.3856, 
     38.3458 
     ] 
     }, 
     "type": "Feature", 
     "properties": { 
     "name": "Node0", 
     "status": "Active", 
     "externalGraphic": "img/node2.png", 
     "graphicHeight": 75, "graphicWidth": 75 
     }, 
     "id": 100 
    }, 
    { 
     "geometry": { 
     "type": "Point", 
     "coordinates": [ 
      -70.885810, 
     38.344722 
     ] 
     }, 
     "type": "Feature", 
     "properties": { 
     "name": "Node1", 
     "status": "Active", 
     "externalGraphic": "img/node2.png", 
     "graphicHeight": 75, "graphicWidth": 75 
     }, 
     "id": 101 
    } 
    ] 
} 

ответ

1

Хорошо, вот как я имел дело с вопросом:

  1. Я использую встроенный веб-сервер Jetty в своем фоновом режиме, но независимо, я создал сервлет, чтобы отвечать данными формата GeoJSON. Каждое местоположение функции lon/lat преобразуется между проекциями. (например, EPSG: 4326 - EPSG: 900913)

  2. Переговорный разговор lon/lat помог GeoTools Java API. Этот блог был особенно полезным (http://ariasprado.name/2012/08/13/quick-and-dirty-coordinate-transforming-using-geotools.html) Обратите внимание, что вам необходимо пройти справедливый бит проб и ошибок, если вы только хотите включить банки, необходимые для преобразования YOUT проекции. GeoTools большой, делает много, и имеет ряд банок .

Теперь, когда GeoExt.data.ProtocolProxy загружает мое содержание GeoJSON это уже в OSM совместимом EPSG: 900913. Мне бы хотелось разобраться с этим полностью в GeoExt/OpenLayer, но, похоже, это нелегкий путь. Я буду признавать, что GeoExt и OpenLayers не имеют превосходной справочной документации.

Я бы включил свой код GeoTools, но сообщение в блоге «Arias Prado GIS Ramblings» выше, чем я мог. Опять же, обратите внимание, что вам придется проб и ошибок в баночках. Кодировки проекции загружаются динамически, и они, в свою очередь, имеют зависимости классов от других банок.

Смежные вопросы