Проблема с KML в OpenLayers

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Проблема с KML в OpenLayers

Сообщение Kris »

У меня на карте несколько слоев: Google, WMS, Vector, kml.
Когда в качестве базового слоя выбираю Google, точки из kml слоев отображаются не там где нужно,не на своих координатах (координаты проверены, ошибки быть не может). При этом их местоположение меняется при зуммировании и передвижении карты мышью и контролерами.

Код: Выделить всё

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script src="OpenLayers.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

	
	<style type="text/css">
	        /* General settings */
            body {
                font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
                font-size: small;
            }
            /* Toolbar styles */
            #toolbar {
                position: relative;
                padding-bottom: 0.5em;
                display: none;
            }
            
            #toolbar ul {
                list-style: none;
                padding: 0;
                margin: 0;
            }
            
            #toolbar ul li {
                float: left;
                padding-right: 1em;
                padding-bottom: 0.5em;
            }
            
            #toolbar ul li a {
                font-weight: bold;
                font-size: smaller;
                vertical-align: middle;
                color: black;
                text-decoration: none;
            }

            #toolbar ul li a:hover {
                text-decoration: underline;
            }
            
            #toolbar ul li * {
                vertical-align: middle;
            }

            /* The map and the location bar */
            #map {
                clear: both;
                position: relative;
                width: 1200px;
                height: 680px;
                border: 1px solid black;
            }
            
            #wrapper {
                width: 700px;
            }
            
            #location {
                float: right;
            }
            
            #options {
                position: absolute;
                left: 13px;
                top: 7px;
                z-index: 3000;
            }

            /* Styles used by the default GetFeatureInfo output, added to make IE happy */
            table.featureInfo, table.featureInfo td, table.featureInfo th {
                border: 1px solid #ddd;
                border-collapse: collapse;
                margin: 0;
                padding: 0;
                font-size: 90%;
                padding: .2em .1em;
            }
            
            table.featureInfo th {
                padding: .2em .2em;
                text-transform: uppercase;
                font-weight: bold;
                backgroundelement.style {
    height: 120%;
    overflow: hidden;
    position: relative;: #eee;
            }
            
            table.featureInfo td {
                background: #fff;
            }
            
            table.featureInfo tr.odd td {
                background: #eee;
            }
            
            table.featureInfo caption {
                text-align: left;
                font-size: 100%;
                font-weight: bold;
                text-transform: uppercase;
                padding: .2em .2em;
            }
        </style>
<script src="http://maps.google.com/maps?file=api&v=2&key=ключ" type="text/javascript" encoding="utf-8"></script>
    <script src="lib/Firebug/firebug.js"></script>
	<script type="text/javascript">
        var map, layer, geojson, vectors, tty;
		var mal = new Array(6);
		var tell,tell_l;
		var cql_query='';
				
		format = 'image/png';
        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
        OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;

        function init(){
		var options = {
                    controls: [],
					projection: "EPSG:4326",
                    units: 'degrees'
                };

            map = new OpenLayers.Map( 'map', options);
			vectors = new OpenLayers.Layer.Vector(
                "Vector Layer"
            );
            map.addLayers([vectors]);

			layer1 = new OpenLayers.Layer.WMS( "Границы Российской Федерации","#############", {layers: 'oblasts'});
			map.addLayer(layer1);
			
			layer = new OpenLayers.Layer.WMS( "Каталог", "############", {layers: '#############', transparent: 'true'},{'reproject': true}
 );
			map.addLayer(layer);
		
			layer5 = new OpenLayers.Layer.Google( "Слой Гугла", {type: G_SATELLITE_MAP, numZoomLevels: 20} );
			map.addLayer(layer5);
			
			layer6 = new OpenLayers.Layer.Google( "Слой Гугла(рельеф)", {type: G_PHYSICAL_MAP, numZoomLevels: 20} );
			map.addLayer(layer6);
			
			layer2 = new OpenLayers.Layer.WMS( "Населеннные пункты Российской Федерации", "###############", {layers: '########', transparent: 'false'} );
			map.addLayer(layer2);
			
			var kml1 = new OpenLayers.Layer.Vector("KML", {
                strategies: [new OpenLayers.Strategy.Fixed()],
                protocol: new OpenLayers.Protocol.HTTP({
                    url: "kml1.kml",
                    format: new OpenLayers.Format.KML({
                        extractStyles: true,
                        extractAttributes: true
                    })
                })
            });
			var kml = new OpenLayers.Layer.Vector("KML", {
                strategies: [new OpenLayers.Strategy.Fixed()],
                protocol: new OpenLayers.Protocol.HTTP({
                    url: "kml.kml",
                    format: new OpenLayers.Format.KML({
                        extractStyles: true,
                        extractAttributes: true
                    })
                })
            });

            map.addLayers([kml, kml1]);           
            map.addControl(new OpenLayers.Control.PanZoomBar({position: new OpenLayers.Pixel(2, 15)}));
            map.addControl(new OpenLayers.Control.Navigation());
            map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));
			map.addControl(new OpenLayers.Control.Navigation());
			map.addControl(new OpenLayers.Control.Scale($('scale')));
			map.addControl( new OpenLayers.Control.LayerSwitcher() );

			var panel = new OpenLayers.Control.EditingToolbar(vectors);
            map.addControl(panel);
			
			geojson = new OpenLayers.Format.GeoJSON();
			
			map.setCenter(new OpenLayers.LonLat(102, 63), 3);

			drawCtrl = map.getControlsByClass('OpenLayers.Control.DrawFeature')[2];
    drawCtrl.events.register("featureadded", drawCtrl, function(e) {
        console.log(geojson.write(e.feature, true));
        console.log(e.feature.geometry.getVertices());
		tty=e.feature.geometry.getVertices();
		var i = 0;
		tell = "";
		for (i=0; i<tty.length; i++)
		{
			tell = tell + tty[i].x + " " + tty[i].y + ", "; 
		}
		tell = tell + tty[0].x + " " + tty[0].y; 
		tell_l=tell;

		document.getElementById('features').value=tell;
    });
			
			map.events.register('click', map, function (e) {
                    document.getElementById('nodelist').innerHTML = "Загрузка... подождите...";
                    var params = {
                        REQUEST: "GetFeatureInfo",
                        EXCEPTIONS: "application/vnd.ogc.se_xml",
                        BBOX: map.getExtent().toBBOX(),
                        X: e.xy.x,
                        Y: e.xy.y,
                        INFO_FORMAT: 'text/html',
                        QUERY_LAYERS: map.layers[2].params.LAYERS,
                        FEATURE_COUNT: 50,
                        Layers: '###########################',
                        Styles: '',
                        Srs: 'EPSG:4326',
                        WIDTH: map.size.w,
                        HEIGHT: map.size.h,                        
                        format: format};
                    if(cql_query)
                    { params.CQL_FILTER=cql_query; }
                    OpenLayers.loadURL("############################", params, this, setHTML, setHTML);
                    OpenLayers.Event.stop(e);
                });            
        }
		function serialize() {            
			var str = geojson.write(vectors.features, true);
            document.getElementById('features').value = str.features;
        }
        (function() {
            var roots = ["draw_point", "draw_line", "draw_polygon", "pan"];
            var onImages = [];
            var offImages = [];
            for(var i=0; i<roots.length; ++i) {
                onImages[i] = new Image();
                onImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
                offImages[i] = new Image();
                offImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
            }
        })();
		// sets the HTML provided into the nodelist element
        function setHTML(response){
			var http; 
			if (response.responseText != "") {
				document.getElementById('nodelist').innerHTML = response.responseText;
			}
			else
			{
				document.getElementById('nodelist').innerHTML = '<html> <body>Данные не могут быть загружены</body> </html>';				
			}
        };
    </script>
  </head>
  <body onload="init()">

    <div id="map">
	</div>
    <div id="wrapper">

		<div id="location">Позиция указателя</div>
		<div id="scale"></div>
     </div>
Минимальный год:  <input type="text" id="min_year_filter"><br />
Максимальный год: <input type="text" id="max_year_filter"><br />
<br />
Минимальная Величина1:  <input type="text" id="min_e_filter"><br />
Максимальная Величина1: <input type="text" id="max_e_filter"><br />
<br />
Минимальная Величина2:  <input type="text" id="min_h_filter"><br />
Максимальная Величина2: <input type="text" id="max_h_filter"><br />
<input type="button" value="Обновить слой" id="update_layer_button">

     <script>
function get_field_value(field_id, ret_if_nan)
{
	var result;
	result = parseFloat($(field_id).val());
	if (isNaN(result)) {
		result = ret_if_nan;
	}
	return result;

}

function prep_cql(param_name, min_val, max_val)
{
	return param_name+" BETWEEN "+min_val+" AND "+max_val;
}

$(document).ready(function() {
    $('#update_layer_button').click(function() {

	var CQL_AND=' AND ';

	min_m = get_field_value("#min_e_filter", 0);
	max_m = get_field_value("#max_e_filter", 100000);

	min_y = get_field_value("#min_year_filter", 0);
	max_y = get_field_value("#max_year_filter", 2000);

	min_d = get_field_value("#min_h_filter", 0);
	max_d = get_field_value("#max_h_filter", 100000);
	
	pol=get_field_value("#max_h_filter", 100000);
	cql_query ='';
	cql_query = prep_cql("e", min_m, max_m) + CQL_AND + prep_cql("h", min_d, max_d);
	cql_query = cql_query + CQL_AND + prep_cql("date_year", min_y, max_y);
	if(tell){cql_query = cql_query + CQL_AND + " NOT DISJOINT(geom, POLYGON((" + tell + ")))";};
	tell='';
	    map.layers[0].removeFeatures(map.layers[0].features[map.layers[0].features.length-1]) 
alert(cql_query);

        layer.mergeNewParams({'CQL_FILTER': cql_query});
    });

});
     </script>
	 <div id="info">
        <p>Features</p>

        <input type="button" value="refresh" onclick="serialize();"><br>
        <textarea id="features"></textarea>
    </div>
	<div id="nodelist">
            <em>Щелкните на карте для получения данных слоя</em>
    </div>
	
  
  </body>
</html>
Как сделать так, чтоб точки из kml слоев отображались на своих местах(координатах), не перемещались при зуммировании и перемещении карты мышью?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Проблема с KML в OpenLayers

Сообщение Denis Rykov »

Потому что проекция GM отличается от проекции оверлеев, используйте опцию sphericalMercator:

Код: Выделить всё

var G_map  = new OpenLayers.Layer.Google("Google",{type: G_NORMAL_MAP, sphericalMercator: true}); 
Spatial is now, more than ever, just another column- The Geometry Column.
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение Kris »

Этого не достаточно.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Проблема с KML в OpenLayers

Сообщение Denis Rykov »

Вполне.
Spatial is now, more than ever, just another column- The Geometry Column.
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение Kris »

Добавление этой опции не дает результата.
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение Kris »

Нашел пример, но не совсем понимаю,что делают функции:

Код: Выделить всё

function onPopupClose(evt) {
            select.unselectAll();
        }
        function onFeatureSelect(event) {
            var feature = event.feature;
            var selectedFeature = feature;
            var popup = new OpenLayers.Popup.FramedCloud("chicken", 
                feature.geometry.getBounds().getCenterLonLat(),
                new OpenLayers.Size(100,100),
                "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description,
                null, true, onPopupClose
            );
            feature.popup = popup;
            map.addPopup(popup);
        }
        function onFeatureUnselect(event) {
            var feature = event.feature;
            if(feature.popup) {
                map.removePopup(feature.popup);
                feature.popup.destroy();
                delete feature.popup;
            }
        }
за что отвечает:

Код: Выделить всё

strategies: [new OpenLayers.Strategy.Fixed()]
И как работает

Код: Выделить всё

select = new OpenLayers.Control.SelectFeature(sundials);
            
            sundials.events.on({
                "featureselected": onFeatureSelect,
                "featureunselected": onFeatureUnselect
            });
  
            map.addControl(select);
            select.activate();   

            map.addControl(new OpenLayers.Control.LayerSwitcher());

            map.zoomToExtent(
                new OpenLayers.Bounds(
                    68.774414, 11.381836, 123.662109, 34.628906
                ).transform(map.displayProjection, map.projection)
            );
ведь sundials это же слой.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Проблема с KML в OpenLayers

Сообщение Denis Rykov »

Код: Выделить всё

function onPopupClose(evt) {
            select.unselectAll();
        }

function onFeatureSelect(event) {
    var feature = event.feature;
    var selectedFeature = feature;
    var popup = new OpenLayers.Popup.FramedCloud("chicken", 
        feature.geometry.getBounds().getCenterLonLat(),
        new OpenLayers.Size(100,100),
        "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description,
        null, true, onPopupClose
    );
    feature.popup = popup;
    map.addPopup(popup);
}

function onFeatureUnselect(event) {
    var feature = event.feature;
    if(feature.popup) {
        map.removePopup(feature.popup);
        feature.popup.destroy();
        delete feature.popup;
    }
} 
Здесь представлены три функции: onPopupClose, onFeatureSelect, onFeatureUnselect. Первая снимает выделение со всех объектов, выделенных контролом select. Вторая добавляет попап на карту к выделенному объекту. Третья его удаляет.

Код: Выделить всё

strategies: [new OpenLayers.Strategy.Fixed()] 
Отвечает за загрузку слоя, при использовании стратегии Fixed - слой загружается полностью, в отличии, например, от стратегии BBOX - где загружаются только данные, попадающие в текущий охват.

Код: Выделить всё

select = new OpenLayers.Control.SelectFeature(sundials);
            
sundials.events.on({
    "featureselected": onFeatureSelect,
    "featureunselected": onFeatureUnselect
});
  
map.addControl(select);
select.activate();   

map.addControl(new OpenLayers.Control.LayerSwitcher());

map.zoomToExtent(
    new OpenLayers.Bounds(
         68.774414, 11.381836, 123.662109, 34.628906
     ).transform(map.displayProjection, map.projection)
); 
select - контрол SelectFeature, повешенный на слой sundials. sundials.events.on - регистрирует события и на каждое событие вызывает соответствующую функцию. Дальше происходит добавление контрола на карту и его активация. В конце зум на указанный охват.
Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Проблема с KML в OpenLayers

Сообщение Denis Rykov »

Kris писал(а):Добавление этой опции не дает результата.
В приведенном вами примере как раз использование указанной опции и даёт нужный результат.
Spatial is now, more than ever, just another column- The Geometry Column.
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение Kris »

_DR_ , спасибо за помощь. Вроде разобрался.

Но возникла необходимость перевести координаты слоя google в координаты проекции EPSG:4326.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Проблема с KML в OpenLayers

Сообщение Denis Rykov »

Дайте ссылку на ваш проект, посмотрю.
Spatial is now, more than ever, just another column- The Geometry Column.
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение Kris »

Ссылку пока дать не могу.

Для решения предыдущей проблемы использовал код, который вы прокомментировали выше.
Суть текущей проблемы в том, что когда я кликаю на точку(координаты около 50 с.ш. 137 в.д.), то получаю координаты 15256292 и 6542112. А нужно получать как раз 50 с.ш. 137 в.д.
Координаты округлил до целых.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Проблема с KML в OpenLayers

Сообщение Denis Rykov »

То есть проблему совмещения своих данных с подложкой гугла вы решили? Чтобы получать значения координат мыши в нужной ск, добавьте в опции объекта map строку:

Код: Выделить всё

displayProjection: new OpenLayers.Projection("EPSG:4326") 
Spatial is now, more than ever, just another column- The Geometry Column.
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение Kris »

Проблема решена, но скорее всего не правильно.

Строка:

Код: Выделить всё

displayProjection: new OpenLayers.Projection("EPSG:4326") 
указана в опциях, но желаемого результата нет.

Сейчас код выглядит так:

Код: Выделить всё

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <title>Test</title>
    
    <link rel="stylesheet" href="theme/default/style.css" type="text/css">

    <link rel="stylesheet" href="style.css" type="text/css">

    <style type="text/css">
        html, body {
            height: 100%;
        }
        #map {
            width: 80%;
            height: 60%;
            border: 1px solid black;
        }
        .olPopup p { margin:0px; font-size: .9em;}
        .olPopup h2 { font-size:1.2em; }
    </style>
    <script src="OpenLayers.js"></script>
    <script src="http://maps.google.com/maps?file=api&v=2&key=ключ" type="text/javascript" encoding="utf-8"></script>
    <script src="lib/Firebug/firebug.js"></script>
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
	<script type="text/javascript">
        var lon = 5;
        var lat = 40;
        var zoom = 5;
        var map, select;
		var layer, geojson, vectors, tty;
		var mal = new Array(6);
		var tell,tell_l;
		var cql_query='';
				
		format = 'image/png';
        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
        OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;
		
		
        function init(){
            var options = {
                projection: new OpenLayers.Projection("EPSG:4326"),
                displayProjection: new OpenLayers.Projection("EPSG:4326"),
                units: "m",
                maxResolution: 156543.0339,
                maxExtent: new OpenLayers.Bounds(-200375080.34, -200375080.34, 200375080.34, 200375080.34)
            };
            map = new OpenLayers.Map('map', options);
			vectors = new OpenLayers.Layer.Vector(
                "Vector Layer"
            );
            map.addLayers([vectors]);
		   layer6 = new OpenLayers.Layer.Google( "Слой Гугла(рельеф)", {type: G_PHYSICAL_MAP, sphericalMercator:true});
			map.addLayer(layer6);
            var sundials1 = new OpenLayers.Layer.Vector("KML", {
                projection: map.displayProjection,
                strategies: [new OpenLayers.Strategy.Fixed()],
                protocol: new OpenLayers.Protocol.HTTP({
                    url: "kml.kml",
                    format: new OpenLayers.Format.KML({
                        extractStyles: true,
                        extractAttributes: true
                    })
                })
            });
			var sundials = new OpenLayers.Layer.Vector("KML", {
                projection: map.displayProjection,
                strategies: [new OpenLayers.Strategy.Fixed()],
                protocol: new OpenLayers.Protocol.HTTP({
                    url: "kml1.kml",
                    format: new OpenLayers.Format.KML({
                        extractStyles: true,
                        extractAttributes: true
                    })
                })
            });

            map.addLayers([sundials, sundials1]);

            select = new OpenLayers.Control.SelectFeature(sundials);
            
            sundials.events.on({
                "featureselected": onFeatureSelect,
                "featureunselected": onFeatureUnselect
            });
			//////////////////////////
			

			layer1 = new OpenLayers.Layer.WMS( "Границы Российской Федерации","###############", {layers: 'oblasts'});
			map.addLayer(layer1);
			
			layer = new OpenLayers.Layer.WMS( "Каталог", "#############", {layers: '###############', transparent: 'true'},{'reproject': true}
 );
			map.addLayer(layer);
		
			layer5 = new OpenLayers.Layer.Google( "Слой Гугла", {type: G_SATELLITE_MAP, sphericalMercator:true} );
			map.addLayer(layer5);
			
			layer2 = new OpenLayers.Layer.WMS( "Населеннные пункты Российской Федерации", "############", {layers: '###########', transparent: 'false'} );
			map.addLayer(layer2);
			////////////////////////
			
            map.addControl(select);
            select.activate();   

            map.zoomToExtent(
                new OpenLayers.Bounds(
                    68.774414, 11.381836, 123.662109, 34.628906
                ).transform(map.displayProjection, map.projection)
            );
			
			///*********
			
			///***********
			// build up all controls            
            map.addControl(new OpenLayers.Control.PanZoomBar({position: new OpenLayers.Pixel(2, 15)}));
            map.addControl(new OpenLayers.Control.Navigation());
            map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));
			map.addControl(new OpenLayers.Control.Navigation());
			map.addControl(new OpenLayers.Control.Scale($('scale')));
			map.addControl( new OpenLayers.Control.LayerSwitcher() );

			var panel = new OpenLayers.Control.EditingToolbar(vectors);
            map.addControl(panel);
			
			geojson = new OpenLayers.Format.GeoJSON();
			

			map.setCenter(new OpenLayers.LonLat(102, 63), 3);

			drawCtrl = map.getControlsByClass('OpenLayers.Control.DrawFeature')[2];
    drawCtrl.events.register("featureadded", drawCtrl, function(e) {

		tty=e.feature.geometry.getVertices();

		var i = 0;
		tell = "";
		for (i=0; i<tty.length; i++)
		{
			tell = tell + tty[i].x + " " + tty[i].y + ", "; 
		}
		tell = tell + tty[0].x + " " + tty[0].y; 
		tell_l=tell;
    });
			/**/
			map.events.register('click', map, function (e) {
                    document.getElementById('nodelist').innerHTML = "Загрузка... подождите...";
                    var params = {
                        REQUEST: "GetFeatureInfo",
                        EXCEPTIONS: "application/vnd.ogc.se_xml",
                        BBOX: map.getExtent().toBBOX(),
                        X: e.xy.x,
                        Y: e.xy.y,
                        INFO_FORMAT: 'text/html',
                        QUERY_LAYERS: map.layers[5].params.LAYERS,
                        FEATURE_COUNT: 50,
                        Layers: '#################',
                        Styles: '',
                        Srs: 'EPSG:4326',
                        WIDTH: map.size.w,
                        HEIGHT: map.size.h,                        
                        format: format};
                    if(cql_query)
                    { params.CQL_FILTER=cql_query; }
                    OpenLayers.loadURL("####################", params, this, setHTML, setHTML);
                    OpenLayers.Event.stop(e);
                });
        }
        function onPopupClose(evt) {
            select.unselectAll();
        }
		function serialize() {            
			var str = geojson.write(vectors.features, true);
            document.getElementById('features').value = str.features;
			document.getElementById('features').value=tell;
        }
        function onFeatureSelect(event) {
            var feature = event.feature;
            var selectedFeature = feature;
            var popup = new OpenLayers.Popup.FramedCloud("chicken", 
                feature.geometry.getBounds().getCenterLonLat(),
                new OpenLayers.Size(100,100),
                "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description,
                null, true, onPopupClose
            );
            feature.popup = popup;
            map.addPopup(popup);
        }
        function onFeatureUnselect(event) {
            var feature = event.feature;
            if(feature.popup) {
                map.removePopup(feature.popup);
                feature.popup.destroy();
                delete feature.popup;
            }
        }
		
		// preload images
        (function() {
            var roots = ["draw_point", "draw_line", "draw_polygon", "pan"];
            var onImages = [];
            var offImages = [];
            for(var i=0; i<roots.length; ++i) {
                onImages[i] = new Image();
                onImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
                offImages[i] = new Image();
                offImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
            }
        })();
		
		// sets the HTML provided into the nodelist element
        function setHTML(response){
			var http; 
			if (response.responseText != "") {
				document.getElementById('nodelist').innerHTML = response.responseText;
			}
			else
			{
				document.getElementById('nodelist').innerHTML = '<html> <body>Данные не могут быть загружены</body> </html>';				
			}
        };
    </script>
  </head>
  <body onload="init()">

    <div id="map">
	</div>
    <div id="wrapper">

		<div id="location">Позиция указателя</div>
		<div id="scale"></div>
     </div>
Минимальный год:  <input type="text" id="min_year_filter"><br />
Максимальный год: <input type="text" id="max_year_filter"><br />
<br />
Минимальная Величина1:  <input type="text" id="min_magnitude_filter"><br />
Максимальная Величина1: <input type="text" id="max_magnitude_filter"><br />
<br />
Минимальная Величина2:  <input type="text" id="min_depth_filter"><br />
Максимальная Величина2: <input type="text" id="max_depth_filter"><br />
<input type="button" value="Обновить слой" id="update_layer_button">

     <script>
function get_field_value(field_id, ret_if_nan)
{
	var result;
	result = parseFloat($(field_id).val());
	if (isNaN(result)) {
		result = ret_if_nan;
	}
	return result;

}

function prep_cql(param_name, min_val, max_val)
{
	return param_name+" BETWEEN "+min_val+" AND "+max_val;
}

$(document).ready(function() {
document.getElementById('features').value=tell;
    $('#update_layer_button').click(function() {
document.getElementById('features').value=tell;
	var CQL_AND=' AND ';

	min_m = get_field_value("#min_e_filter", 0);
	max_m = get_field_value("#max_e_filter", 100000);

	min_y = get_field_value("#min_year_filter", 0);
	max_y = get_field_value("#max_year_filter", 2000);

	min_d = get_field_value("#min_h_filter", 0);
	max_d = get_field_value("#max_h_filter", 100000);
	
	pol=get_field_value("#max_h_filter", 100000);
	cql_query ='';
	cql_query = prep_cql("e", min_m, max_m) + CQL_AND + prep_cql("h", min_d, max_d);
	cql_query = cql_query + CQL_AND + prep_cql("date_year", min_y, max_y);
	if(tell){cql_query = cql_query + CQL_AND + " NOT DISJOINT(geom, POLYGON((" + tell + ")))";};
	tell='';
	    map.layers[0].removeFeatures(map.layers[0].features[map.layers[0].features.length-1]) 
alert(cql_query);

        layer.mergeNewParams({'CQL_FILTER': cql_query});
    });

});
     </script>
	 <div id="info">
        <p>Features</p>

        <input type="button" value="refresh" onclick="serialize();"><br>
        <textarea id="features"></textarea>
    </div>
	<div id="nodelist">
            <em>Щелкните на карте для получения данных слоя</em>
    </div>
	
  
</html>
kosyag
Интересующийся
Сообщения: 30
Зарегистрирован: 22 янв 2010, 13:19
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение kosyag »

_DR_ писал(а):То есть проблему совмещения своих данных с подложкой гугла вы решили? Чтобы получать значения координат мыши в нужной ск, добавьте в опции объекта map строку:

Код: Выделить всё

displayProjection: new OpenLayers.Projection("EPSG:4326") 
У меня это заработало почему-то только после подключения Proj4js. :|
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

Re: Проблема с KML в OpenLayers

Сообщение Kris »

А как вы его подключили?
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя