Skip to content

Instantly share code, notes, and snippets.

@mjy
Forked from rdmpage/index.html
Created May 16, 2014 04:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mjy/d54e148e3a0094d9759f to your computer and use it in GitHub Desktop.
Save mjy/d54e148e3a0094d9759f to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Edit point location (with georeferencing)</title>
<style type="text/css">
body {
margin: 0;
padding: 40px;
font-family: sans-serif;
}
.explain {
color:rgb(192,192,192);
}
#map {
width: 100%;
height: 300px;
}
</style>
<script src="http://www.google.com/jsapi"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript">
var map_widget = null;
var MapEditor = function (lat, long, radius) {
var map;
var marker = null;
var circle = null;
var precision = radius;
google.load('maps', '3', {
other_params: 'sensor=false'
});
google.setOnLoadCallback(initialize);
//------------------------------------------------------------------------------------------
function update_latitude(decimal_latitude) {
$("#latitude_decimal").val(decimal_latitude);
decimalToDms(decimal_latitude, true);
}
//------------------------------------------------------------------------------------------
function update_longitude(decimal_longitude) {
$("#longitude_decimal").val(decimal_longitude);
decimalToDms(decimal_longitude, false);
}
//------------------------------------------------------------------------------------------
// http://stackoverflow.com/questions/5786025/decimal-degrees-to-degrees-minutes-and-seconds-in-javascript
function decimalToDms(decimal, latitude) {
var hemisphere = '';
if (latitude) {
hemisphere = decimal > 0 ? 'N' : 'S';
} else {
hemisphere = decimal > 0 ? 'E' : 'W';
}
var degrees = 0 | Math.abs(decimal);
var minutes = 0 | Math.abs(decimal) % 1 * 60;
var seconds = 0 | Math.round((Math.abs(decimal) % 1 * 60 - minutes) * 60);
// handle rounding
if (seconds == 60) {
minutes++;
seconds = 0;
}
if (minutes == 60) {
degrees++;
minutes = 0;
}
if (latitude) {
$("#latitude_degrees").val(degrees);
$("#latitude_minutes").val(minutes);
$("#latitude_seconds").val(seconds);
$("#latitude_hemisphere").val(hemisphere);
} else {
$("#longitude_degrees").val(degrees);
$("#longitude_minutes").val(minutes);
$("#longitude_seconds").val(seconds);
$("#longitude_hemisphere").val(hemisphere);
}
}
//------------------------------------------------------------------------------------------
function dmsToDecimal(degrees, minutes, seconds, hemisphere) {
var decimal = degrees + minutes/60 + seconds/3600;
if (hemisphere == 'S') {
decimal *= -1;
}
if (hemisphere == 'W') {
decimal *= -1;
}
return decimal;
}
//------------------------------------------------------------------------------------------
function reset(lat, long, radius) {
var pos = new google.maps.LatLng(lat, long);
// point
update_latitude(pos.lat());
update_longitude(pos.lng());
marker.setPosition(pos);
// uncertainty
circle.setCenter(pos);
precision = radius;
$("#latitude_longitude_precision").val(precision);
circle.setRadius(precision);
// move map
map.setCenter(pos);
}
//------------------------------------------------------------------------------------------
function initialize() {
var center = new google.maps.LatLng(lat, long);
update_latitude(center.lat());
update_longitude(center.lng());
$("#latitude_longitude_precision").val(precision);
map = new google.maps.Map(document.getElementById('map'), {
zoom: 10,
center: center,
mapTypeId: google.maps.MapTypeId.TERRAIN,
draggableCursor: 'auto',
scaleControl: true
});
circle = new google.maps.Circle({
strokeColor: "#882A28",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#FF6963",
fillOpacity: 0.3,
editable: true,
center: center,
map: map,
radius:precision
});
marker = new google.maps.Marker(
{
map:map,
draggable:true,
animation: google.maps.Animation.DROP,
position: center
});
// User has moved marker
google.maps.event.addListener(marker, 'dragend', function()
{
var pos = this.getPosition();
update_latitude(pos.lat());
update_longitude(pos.lng());
circle.setCenter(pos);
});
// User has moved circle
google.maps.event.addListener(circle, 'center_changed', function()
{
var pos = this.getCenter();
update_latitude(pos.lat());
update_longitude(pos.lng());
marker.setPosition(pos);
});
// User has changed circle size
google.maps.event.addListener(circle, 'radius_changed', function()
{
var precision = Math.floor(this.getRadius());
$("#latitude_longitude_precision").val(precision);
});
$('td[id^="view"]').click(function() {
var id = $(this).attr('id');
id = id.replace(/view/, '');
var lat = parseFloat($('#lat' + id).html());
var long = parseFloat($('#long' + id).html());
var radius = parseInt($('#radius' + id).html());
reset(lat, long, radius);
});
// Georeferencing
$('#georeference_go').click(function() {
$('#row0').hide();
$('#row1').hide();
$('#row2').hide();
var locality = $("#georeference_locality").val();
var country = $("#georeference_country").val();
var url = 'http://www.museum.tulane.edu/webservices/geolocatesvcv2/glcwrap.aspx';
url += '?locality=' + encodeURIComponent(locality) + '&country=' + encodeURIComponent(country);
$.getJSON(url + '&callback=?',
function(data){
if (data.resultSet) {
if (data.resultSet.length != 0) {
for (var i in data.resultSet.features) {
var lat = data.resultSet.features[i].geometry.coordinates[1];
var long = data.resultSet.features[i].geometry.coordinates[0];
var radius = data.resultSet.features[i].properties.uncertaintyRadiusMeters;
$('#lat' + i).html(lat);
$('#long' + i).html(long);
$('#radius' + i).html(radius);
$('#row' + i).show();
}
}
} else {
}
});
});
// Handle text inputs
$('#latitude_longitude_precision').blur(function() {
var precision = parseInt($("#latitude_longitude_precision").val());
// Make sure this a sensible number, ignore but inputs
if (isNaN(precision)) {
// not a number, ignore
precision = 10000;
} else {
if ((precision < 0) || (precision > 100000)) {
precision = 10000;
}
}
$("#latitude_longitude_precision").val(precision);
circle.setRadius(precision);
});
$('#latitude_decimal').blur(function() {
var currentPos = marker.getPosition();
var decimal_latitude = $("#latitude_decimal").val();
// Make sure this a sensible number, ignore but inputs
if (isNaN(decimal_latitude)) {
// not a number, ignore
decimal_latitude = currentPos.lat();
} else {
if ((decimal_latitude < -90) || (decimal_latitude > 90)) {
decimal_latitude = currentPos.lat();
}
}
if (decimal_latitude == currentPos.lat()) {
$("#latitude_decimal").val(decimal_latitude);
} else {
decimalToDms(decimal_latitude, true);
var newPos = new google.maps.LatLng(decimal_latitude, currentPos.lng());
circle.setCenter(newPos);
map.setCenter(newPos);
}
});
$('#longitude_decimal').blur(function() {
var currentPos = marker.getPosition();
var decimal_longitude = $("#longitude_decimal").val();
// Make sure this a sensible number, ignore but inputs
if (isNaN(decimal_longitude)) {
// not a number, ignore
decimal_longitude = currentPos.lng();
} else {
if ((decimal_longitude < -180) || (decimal_longitude > 180)) {
decimal_longitude = currentPos.lng();
}
}
if (decimal_longitude == currentPos.lng()) {
$("#longitude_decimal").val(decimal_longitude);
} else {
decimalToDms(decimal_longitude);
var newPos = new google.maps.LatLng(currentPos.lat(), decimal_longitude);
circle.setCenter(newPos);
map.setCenter(newPos);
}
});
}
};
</script>
</head>
<body>
<h1>Edit point location (with georeferencing)</h1>
<p>UI to edit a point location (inspired by <a href="http://www.inaturalist.org">iNaturalist observation editor</a>).</p>
<p class="explain">Click and drag either the marker or the centre of the circle to move point,
change size of circle to adjust precision, or enter values in text fields.</p>
<div>
<div id="map"></div>
<!-- georeference lookup -->
<div>
<p>Georeference</p>
<p class="explain">Uses Tulane University <a href="http://www.museum.tulane.edu/geolocate/developers/default.html" target="_new">GEOLocate service</a></p>
<input id="georeference_locality" value="Mt. Brandenberg" size="50"></input>
<select id="georeference_country">
<option value="Afghanistan">Afghanistan</option>
<option value="Albania">Albania</option>
<option value="Algeria">Algeria</option>
<option value="American Samoa">American Samoa</option>
<option value="Andorra">Andorra</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Antarctica">Antarctica</option>
<option value="Antigua and Barbuda">Antigua and Barbuda</option>
<option value="Argentina">Argentina</option>
<option value="Armenia">Armenia</option>
<option value="Aruba">Aruba</option>
<option value="Australia">Australia</option>
<option value="Austria">Austria</option>
<option value="Azerbaijan">Azerbaijan</option>
<option value="Bahamas">Bahamas</option>
<option value="Bahrain">Bahrain</option>
<option value="Bangladesh">Bangladesh</option>
<option value="Barbados">Barbados</option>
<option value="Belarus">Belarus</option>
<option value="Belgium">Belgium</option>
<option value="Belize">Belize</option>
<option value="Benin">Benin</option>
<option value="Bermuda">Bermuda</option>
<option value="Bhutan">Bhutan</option>
<option value="Bolivia">Bolivia</option>
<option value="Bosnia and Herzegovina">Bosnia and Herzegovina</option>
<option value="Botswana">Botswana</option>
<option value="Bouvet Island">Bouvet Island</option>
<option value="Brazil">Brazil</option>
<option value="British Indian Ocean Territory">British Indian Ocean Territory</option>
<option value="Brunei Darussalam">Brunei Darussalam</option>
<option value="Bulgaria">Bulgaria</option>
<option value="Burkina Faso">Burkina Faso</option>
<option value="Burundi">Burundi</option>
<option value="Cambodia">Cambodia</option>
<option value="Cameroon">Cameroon</option>
<option value="Canada">Canada</option>
<option value="Cape Verde">Cape Verde</option>
<option value="Cayman Islands">Cayman Islands</option>
<option value="Central African Republic">Central African Republic</option>
<option value="Chad">Chad</option>
<option value="Chile">Chile</option>
<option value="China">China</option>
<option value="Christmas Island">Christmas Island</option>
<option value="Cocos (Keeling) Islands">Cocos (Keeling) Islands</option>
<option value="Colombia">Colombia</option>
<option value="Comoros">Comoros</option>
<option value="Congo">Congo</option>
<option value="Congo, The Democratic Republic of The">Congo, The Democratic Republic of The</option>
<option value="Cook Islands">Cook Islands</option>
<option value="Costa Rica">Costa Rica</option>
<option value="Cote D'ivoire">Cote D'ivoire</option>
<option value="Croatia">Croatia</option>
<option value="Cuba">Cuba</option>
<option value="Cyprus">Cyprus</option>
<option value="Czech Republic">Czech Republic</option>
<option value="Denmark">Denmark</option>
<option value="Djibouti">Djibouti</option>
<option value="Dominica">Dominica</option>
<option value="Dominican Republic">Dominican Republic</option>
<option value="Ecuador">Ecuador</option>
<option value="Egypt">Egypt</option>
<option value="El Salvador">El Salvador</option>
<option value="Equatorial Guinea">Equatorial Guinea</option>
<option value="Eritrea">Eritrea</option>
<option value="Estonia">Estonia</option>
<option value="Ethiopia">Ethiopia</option>
<option value="Falkland Islands (Malvinas)">Falkland Islands (Malvinas)</option>
<option value="Faroe Islands">Faroe Islands</option>
<option value="Fiji">Fiji</option>
<option value="Finland">Finland</option>
<option value="France">France</option>
<option value="French Guiana">French Guiana</option>
<option value="French Polynesia">French Polynesia</option>
<option value="French Southern Territories">French Southern Territories</option>
<option value="Gabon">Gabon</option>
<option value="Gambia">Gambia</option>
<option value="Georgia">Georgia</option>
<option value="Germany">Germany</option>
<option value="Ghana">Ghana</option>
<option value="Gibraltar">Gibraltar</option>
<option value="Greece">Greece</option>
<option value="Greenland">Greenland</option>
<option value="Grenada">Grenada</option>
<option value="Guadeloupe">Guadeloupe</option>
<option value="Guam">Guam</option>
<option value="Guatemala">Guatemala</option>
<option value="Guinea">Guinea</option>
<option value="Guinea-bissau">Guinea-bissau</option>
<option value="Guyana">Guyana</option>
<option value="Haiti">Haiti</option>
<option value="Heard Island and Mcdonald Islands">Heard Island and Mcdonald Islands</option>
<option value="Holy See (Vatican City State)">Holy See (Vatican City State)</option>
<option value="Honduras">Honduras</option>
<option value="Hong Kong">Hong Kong</option>
<option value="Hungary">Hungary</option>
<option value="Iceland">Iceland</option>
<option value="India">India</option>
<option value="Indonesia">Indonesia</option>
<option value="Iran, Islamic Republic of">Iran, Islamic Republic of</option>
<option value="Iraq">Iraq</option>
<option value="Ireland">Ireland</option>
<option value="Israel">Israel</option>
<option value="Italy">Italy</option>
<option value="Jamaica">Jamaica</option>
<option value="Japan">Japan</option>
<option value="Jordan">Jordan</option>
<option value="Kazakhstan">Kazakhstan</option>
<option value="Kenya">Kenya</option>
<option value="Kiribati">Kiribati</option>
<option value="Korea, Democratic People's Republic of">Korea, Democratic People's Republic of</option>
<option value="Korea, Republic of">Korea, Republic of</option>
<option value="Kuwait">Kuwait</option>
<option value="Kyrgyzstan">Kyrgyzstan</option>
<option value="Lao People's Democratic Republic">Lao People's Democratic Republic</option>
<option value="Latvia">Latvia</option>
<option value="Lebanon">Lebanon</option>
<option value="Lesotho">Lesotho</option>
<option value="Liberia">Liberia</option>
<option value="Libyan Arab Jamahiriya">Libyan Arab Jamahiriya</option>
<option value="Liechtenstein">Liechtenstein</option>
<option value="Lithuania">Lithuania</option>
<option value="Luxembourg">Luxembourg</option>
<option value="Macao">Macao</option>
<option value="Macedonia, The Former Yugoslav Republic of">Macedonia, The Former Yugoslav Republic of</option>
<option value="Madagascar">Madagascar</option>
<option value="Malawi">Malawi</option>
<option value="Malaysia">Malaysia</option>
<option value="Maldives">Maldives</option>
<option value="Mali">Mali</option>
<option value="Malta">Malta</option>
<option value="Marshall Islands">Marshall Islands</option>
<option value="Martinique">Martinique</option>
<option value="Mauritania">Mauritania</option>
<option value="Mauritius">Mauritius</option>
<option value="Mayotte">Mayotte</option>
<option value="Mexico">Mexico</option>
<option value="Micronesia, Federated States of">Micronesia, Federated States of</option>
<option value="Moldova, Republic of">Moldova, Republic of</option>
<option value="Monaco">Monaco</option>
<option value="Mongolia">Mongolia</option>
<option value="Montserrat">Montserrat</option>
<option value="Morocco">Morocco</option>
<option value="Mozambique">Mozambique</option>
<option value="Myanmar">Myanmar</option>
<option value="Namibia" selected="">Namibia</option>
<option value="Nauru">Nauru</option>
<option value="Nepal">Nepal</option>
<option value="Netherlands">Netherlands</option>
<option value="Netherlands Antilles">Netherlands Antilles</option>
<option value="New Caledonia">New Caledonia</option>
<option value="New Zealand">New Zealand</option>
<option value="Nicaragua">Nicaragua</option>
<option value="Niger">Niger</option>
<option value="Nigeria">Nigeria</option>
<option value="Niue">Niue</option>
<option value="Norfolk Island">Norfolk Island</option>
<option value="Northern Mariana Islands">Northern Mariana Islands</option>
<option value="Norway">Norway</option>
<option value="Oman">Oman</option>
<option value="Pakistan">Pakistan</option>
<option value="Palau">Palau</option>
<option value="Palestinian Territory, Occupied">Palestinian Territory, Occupied</option>
<option value="Panama">Panama</option>
<option value="Papua New Guinea">Papua New Guinea</option>
<option value="Paraguay">Paraguay</option>
<option value="Peru">Peru</option>
<option value="Philippines">Philippines</option>
<option value="Pitcairn">Pitcairn</option>
<option value="Poland">Poland</option>
<option value="Portugal">Portugal</option>
<option value="Puerto Rico">Puerto Rico</option>
<option value="Qatar">Qatar</option>
<option value="Reunion">Reunion</option>
<option value="Romania">Romania</option>
<option value="Russian Federation">Russian Federation</option>
<option value="Rwanda">Rwanda</option>
<option value="Saint Helena">Saint Helena</option>
<option value="Saint Kitts and Nevis">Saint Kitts and Nevis</option>
<option value="Saint Lucia">Saint Lucia</option>
<option value="Saint Pierre and Miquelon">Saint Pierre and Miquelon</option>
<option value="Saint Vincent and The Grenadines">Saint Vincent and The Grenadines</option>
<option value="Samoa">Samoa</option>
<option value="San Marino">San Marino</option>
<option value="Sao Tome and Principe">Sao Tome and Principe</option>
<option value="Saudi Arabia">Saudi Arabia</option>
<option value="Senegal">Senegal</option>
<option value="Serbia and Montenegro">Serbia and Montenegro</option>
<option value="Seychelles">Seychelles</option>
<option value="Sierra Leone">Sierra Leone</option>
<option value="Singapore">Singapore</option>
<option value="Slovakia">Slovakia</option>
<option value="Slovenia">Slovenia</option>
<option value="Solomon Islands">Solomon Islands</option>
<option value="Somalia">Somalia</option>
<option value="South Africa">South Africa</option>
<option value="South Georgia and The South Sandwich Islands">South Georgia and The South Sandwich Islands</option>
<option value="Spain">Spain</option>
<option value="Sri Lanka">Sri Lanka</option>
<option value="Sudan">Sudan</option>
<option value="Suriname">Suriname</option>
<option value="Svalbard and Jan Mayen">Svalbard and Jan Mayen</option>
<option value="Swaziland">Swaziland</option>
<option value="Sweden">Sweden</option>
<option value="Switzerland">Switzerland</option>
<option value="Syrian Arab Republic">Syrian Arab Republic</option>
<option value="Taiwan, Province of China">Taiwan, Province of China</option>
<option value="Tajikistan">Tajikistan</option>
<option value="Tanzania, United Republic of">Tanzania, United Republic of</option>
<option value="Thailand">Thailand</option>
<option value="Timor-leste">Timor-leste</option>
<option value="Togo">Togo</option>
<option value="Tokelau">Tokelau</option>
<option value="Tonga">Tonga</option>
<option value="Trinidad and Tobago">Trinidad and Tobago</option>
<option value="Tunisia">Tunisia</option>
<option value="Turkey">Turkey</option>
<option value="Turkmenistan">Turkmenistan</option>
<option value="Turks and Caicos Islands">Turks and Caicos Islands</option>
<option value="Tuvalu">Tuvalu</option>
<option value="Uganda">Uganda</option>
<option value="Ukraine">Ukraine</option>
<option value="United Arab Emirates">United Arab Emirates</option>
<option value="United Kingdom">United Kingdom</option>
<option value="USA">United States</option>
<option value="United States Minor Outlying Islands">United States Minor Outlying Islands</option>
<option value="Uruguay">Uruguay</option>
<option value="Uzbekistan">Uzbekistan</option>
<option value="Vanuatu">Vanuatu</option>
<option value="Venezuela">Venezuela</option>
<option value="Viet Nam">Viet Nam</option>
<option value="Virgin Islands, British">Virgin Islands, British</option>
<option value="Virgin Islands, U.S.">Virgin Islands, U.S.</option>
<option value="Wallis and Futuna">Wallis and Futuna</option>
<option value="Western Sahara">Western Sahara</option>
<option value="Yemen">Yemen</option>
<option value="Zambia">Zambia</option>
<option value="Zimbabwe">Zimbabwe</option>
</select>
<button id="georeference_go">Georeference</button>
<div id="georeference_result">
<table>
<tr id="row0" style="display:none">
<td id="lat0"></td>
<td id="long0"></td>
<td id="radius0"></td>
<td id="view0">Show on map</td>
</tr>
<tr id="row1" style="display:none">
<td id="lat1"></td>
<td id="long1"></td>
<td id="radius1"></td>
<td id="view1">Show on map</td>
</tr>
<tr id="row2" style="display:none">
<td id="lat2"></td>
<td id="long2"></td>
<td id="radius2"></td>
<td id="view2">Show on map</td>
</tr>
</table>
</div>
</div>
<div>
<p>Latitude</p>
<!-- decimal -->
<input id="latitude_decimal" type="text" />
<!-- degrees, minutes, seconds -->
<input id="latitude_degrees" type="text" maxlength="2" size="4" readonly=""/>
<span>&deg;</span>
<input id="latitude_minutes" type="text" maxlength="2" size="2" readonly=""/>
<span>'</span>
<input id="latitude_seconds" type="text" maxlength="2" size="2" readonly=""/>
<span>''</span>
<select id="latitude_hemisphere" disabled="">
<option label="N" value="N"></option>
<option label="S" value="S"></option>
</select>
</div>
<div>
<p>Longitude</p>
<!-- decimal -->
<input id="longitude_decimal" type="text" />
<!-- degrees, minutes, seconds -->
<input id="longitude_degrees" type="text" maxlength="3" size="4" readonly=""/>
<span>&deg;</span>
<input id="longitude_minutes" type="text" maxlength="2" size="2" readonly=""/>
<span>'</span>
<input id="longitude_seconds" type="text" maxlength="2" size="2" readonly=""/>
<span>''</span>
<select id="longitude_hemisphere" disabled="">
<option label="W" value="W"></option>
<option label="E" value="E"></option>
</select>
</div>
<div>
<p>Precision (m)</p>
<input id="latitude_longitude_precision" type="text" />
</div>
</div>
<script>
map_widget = new MapEditor(-21.10,14.35, 7000);
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment