рд╣реЗрд▓реЛ, рд╣реИрдмрд░ред
рдпрд╣ рдкреЛрд╕реНрдЯ рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рдХреА рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧреАред рдЖрдЬ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрддреЗ рд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдХрд┐рд╕реА рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХреА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рди рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реВрдВред рдпрд╣ рд╕рдм OpenLayers 2 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА OpenLayers рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдХрд┐ рдкрд░рддреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд╣рд▓реЗ рд╣реА рдмрди рдЪреБрдХрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдореИрдВ рд╕рдм рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░
рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рд╣реИ ред IMHO, рдУрдПрд▓ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рд╕рд╡рд╛рд▓ рд╢реНрд░рдорд╕рд╛рдзреНрдп рдирд╣реАрдВ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрдЪреНрдЫрд┐рдд рд╡рд╕реНрддреБ рдмрдирд╛рдПрдВ:
var control = new OpenLayers.Control.Geolocate( bind: false, watch: true, geolocationOptions: { enableHighAccuracy: true, maximumAge: 0, timeout: 15000 });
рдФрд░ рдЗрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (OpenLayersMap рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ OpenLayers.Map (рд╡рд┐рдХрд▓реНрдк) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рдореИрдк рдХреА рдЧрдИ рд╡рд╕реНрддреБ рд╣реИ:
OpenLayersMap.addControl(control);
рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИред рдЖрдЧреЗ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:
control.activate();
рдФрд░ рдЕрдВрддрд┐рдо рдЪреАрдЬ рдЬреЛ рдореИрдВрдиреЗ рдЬреЛрдбрд╝реА рд╣реИ, рд╡рд╣ рд╕реНрдерд╛рди рдорд┐рд▓рдиреЗ рдкрд░ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдИрд╡реЗрдВрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
control.events.on({ "locationupdated": function(e) { OpenLayersFunc.Events.GeolocateOnLocationUpdated(e); } })
рдЕрдм рд╣рдорд╛рд░реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рдд рддреИрдпрд╛рд░ рдХрд░реЗрдВ:
var layer = new OpenLayers.Layer.Vector('Geolocate', { styleMap: new OpenLayers.StyleMap( new OpenLayers.Style({ fillColor: '#000', fillOpacity: 0.1, strokeWidth: 0}) ) }); OpenLayersMap.addLayer(layer);
рдпрд╣ OpenLayersFunc.Events.GeolocateOnLocationUpdated рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реНрд╡рдпрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЬрдм "рд╕реНрдерд╛рдирд╛рдкрдиреНрди" рдИрд╡реЗрдВрдЯ рдлрд╛рдпрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХрд╛ рдИрд╡реЗрдВрдЯ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдКрдкрд░ otgalivaetsyaред рдореИрдВрдиреЗ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ рдмрд╕ рджреЗрдЦреЛ:
var vector = OpenLayersMap.getLayersByName('Geolocate')[0]; vector.removeAllFeatures();
рд╕реНрдкрдВрджрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╕рд░реНрдХрд▓ рдореЗрдВ рдПрдХ рд╕реНрдкрдВрджрд┐рдд рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рд╕рд░реНрдХрд▓ - рд╕рд░реНрдХрд▓ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рджрд┐рдЦрддрд╛ рд╣реИ:
var pulsate = function(feature) { var point = feature.geometry.getCentroid(); var bounds = feature.geometry.getBounds(); var radius = Math.abs((bounds.right - bounds.left) / 2); var count = 0; var grow = 'up'; var resize = function() { if (count > 16) { clearInterval(window.resizeInterval); } var interval = radius * 0.03; var ratio = interval / radius; switch (count) { case 4: case 12: grow = 'down'; break; case 8: grow = 'up'; break; } if (grow !== 'up') { ratio = -Math.abs(ratio); } feature.geometry.resize(1 + ratio, point); vector.drawFeature(feature); count++; }; window.resizeInterval = window.setInterval(resize, 50, point, radius); };
рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб:
рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди var layer = new OpenLayers.Layer.Vector('Geolocate', { styleMap: new OpenLayers.StyleMap( new OpenLayers.Style({ fillColor: '#000', fillOpacity: 0.1, strokeWidth: 0}) ) }); OpenLayersMap.addLayer(layer); var control = new OpenLayers.Control.Geolocate( bind: false, watch: true, geolocationOptions: { enableHighAccuracy: true, maximumAge: 0, timeout: 15000 }); OpenLayersMap.addControl(control); control.activate(); OpenLayersFunc.Events.GeolocateFirstRun = true; OpenLayersFunc.Events.GeolocateOnLocationUpdated = function(e) { var vector = OpenLayersTools.Layers.GetLayerByName('Geolocate'); var pulsate = function(feature) { var point = feature.geometry.getCentroid(); var bounds = feature.geometry.getBounds(); var radius = Math.abs((bounds.right - bounds.left) / 2); var count = 0; var grow = 'up'; var resize = function() { if (count > 16) { clearInterval(window.resizeInterval); } var interval = radius * 0.03; var ratio = interval / radius; switch (count) { case 4: case 12: grow = 'down'; break; case 8: grow = 'up'; break; } if (grow !== 'up') { ratio = -Math.abs(ratio); } feature.geometry.resize(1 + ratio, point); vector.drawFeature(feature); count++; }; window.resizeInterval = window.setInterval(resize, 50, point, radius); }; OpenLayersTools.Layers.ClearLayers(['Geolocate']); var polygon = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(e.point.x, e.point.y), e.position.coords.accuracy / 2, 40, 0); var circle = new OpenLayers.Feature.Vector(polygon); var point = new OpenLayers.Feature.Vector(e.point, {}, { graphicName: 'cross', strokeColor: '#f00', strokeWidth: 1, fillOpacity: 0, pointRadius: 8 }); vector.addFeatures([point, circle]); if (OpenLayersFunc.Events.GeolocateFirstRun) { pulsate(circle); OpenLayersFunc.Events.GeolocateFirstRun = false; } }; control.events.on({ "locationupdated": function(e) { OpenLayersFunc.Events.GeolocateOnLocationUpdated(e); } })
рдЪрд▓рд┐рдП рдПрдХ рд╣реА рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ -
рдЬрд┐рдпреЛрдХреЛрдбрд┐рдВрдЧ ред рдореИрдВрдиреЗ google api рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдкрдЫрддрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдкреЙрдкрдЕрдк рдХреЗ рд╕рд╛рде рдорд╛рд░реНрдХрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкрд░рдд рдмрдирд╛рдИ:
var layer = new OpenLayers.Layer.Vector('Geocoder', { styleMap: new OpenLayers.StyleMap( new OpenLayers.Style({ externalGraphic: '../images/geocoder_marker.png', graphicWidth: 32, graphicHeight: 32, graphicYOffset: -32 ) });
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдФрд░ рдПрдХ jQuery рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реБрдВрджрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЬрд┐рдпреЛрдХреЛрдбрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ, Google рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП jquery-ui.autocomplete рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдФрд░ рдЪрдпрди рдкрд░ рд╣рдо рдЗрд╕ рдкрддреЗ рдкрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рд░реНрдХрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
var geocoder = new google.maps.Geocoder();
рдкреВрд░реНрдг рдХреЛрдб рдХреЛ рднреА рд▓рдЯрдХрд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рднреА рд╢реАрд░реНрд╖ рдкрд░ рд╣реИ :)
PS рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ, :)