Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Eric Duminil
RegionChooser
Commits
05caa4b2
Commit
05caa4b2
authored
2 years ago
by
Eric Duminil
Browse files
Options
Download
Email Patches
Plain Diff
Check if geometry is multipolygon.
parent
4218fabd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/main/resources/eu/simstadt/regionchooser/website/script/simstadt_openlayers.js
+23
-11
...stadt/regionchooser/website/script/simstadt_openlayers.js
src/main/resources/eu/simstadt/regionchooser/website/script/utils.js
+24
-20
...sources/eu/simstadt/regionchooser/website/script/utils.js
with
47 additions
and
31 deletions
+47
-31
src/main/resources/eu/simstadt/regionchooser/website/script/simstadt_openlayers.js
+
23
-
11
View file @
05caa4b2
...
...
@@ -294,10 +294,13 @@ const regionChooser = (function(){
function
displayInfo
()
{
dataPanel
.
empty
();
var
geom
=
sketch
.
getGeometry
().
clone
().
transform
(
sourceProj
,
'
EPSG:4326
'
);
var
coordinates
=
geom
.
getLinearRing
(
0
).
getCoordinates
();
var
area
=
Math
.
abs
(
wgs84Sphere
.
geodesicArea
(
coordinates
));
//NOTE: Could show m², ha or km² depending on magnitude
dataPanel
.
append
(
"
<h3 class='clean'>Area :
"
+
(
area
/
10000
).
toFixed
(
1
)
+
"
ha
\n
"
);
if
(
utils
.
is_polygon
(
geom
)){
// It could be a MultiPolygon, for example.
var
coordinates
=
geom
.
getLinearRing
(
0
).
getCoordinates
();
var
area
=
Math
.
abs
(
wgs84Sphere
.
geodesicArea
(
coordinates
));
//NOTE: Could show m², ha or km² depending on magnitude
dataPanel
.
append
(
"
<h3 class='clean'>Area :
"
+
(
area
/
10000
).
toFixed
(
1
)
+
"
ha
\n
"
);
}
dataPanel
.
append
(
'
<div style="visibility:hidden" id="download_region">
'
+
'
<button type="button" onclick="regionChooser.downloadFromSelectedCityGMLs()" id="download_region_button" disabled>Download Region</button><br/>
\n
'
+
'
<a href="#" onclick="regionChooser.selectAllOrNone(true);">(Select All)</a>
\n
'
+
...
...
@@ -381,7 +384,7 @@ const regionChooser = (function(){
//TODO: Show tooltip above.
dataPanel
.
append
(
"
<form id='importWKT'>
\n
"
+
"
<input id='wktPolygon' type='text' placeholder='WKT Polygon'
"
+
"
required pattern=' *POLYGON *
\\
( *
\\
([
\\
-0-9
\
.,
\
)
\
()]+
\\
) *
\\
) *'
"
+
"
required pattern=' *
(MULTI)?
POLYGON *
\\
( *
\\
([
\\
-0-9
\
.,
\
)
\
()]+
\\
) *
\\
) *'
"
+
"
title='Please input a valid WKT Polygon. Example : POLYGON((9.961675 49.807053, 9.951375 49.798521, 9.969486 49.797746, 9.961675 49.807053)) '/>
\n
"
+
"
<input type='submit' value='Import Polygon'/>
\n
"
+
"
</form>
\n
"
);
...
...
@@ -411,13 +414,18 @@ const regionChooser = (function(){
return
false
;
}
// Assuming the linear ring is closed
var
coordinatesCount
=
feature
.
getGeometry
()
.
getLinearRing
(
0
).
getCoordinates
().
length
-
1
;
var
geom
=
feature
.
getGeometry
();
if
(
coordinatesCount
<
2
){
console
.
warn
(
"
Too few points!
"
);
dataPanel
.
prepend
(
"
<h2 class='error'>There should be at least 2 points in WKT polygon</h2><br/>
\n
"
);
return
false
;
if
(
utils
.
is_polygon
(
geom
)){
var
coordinatesCount
=
geom
.
getLinearRing
(
0
).
getCoordinates
().
length
-
1
;
if
(
coordinatesCount
<
2
){
console
.
warn
(
"
Too few points!
"
);
dataPanel
.
prepend
(
"
<h2 class='error'>There should be at least 2 points in WKT polygon</h2><br/>
\n
"
);
return
false
;
}
}
sketch
=
feature
;
...
...
@@ -426,7 +434,7 @@ const regionChooser = (function(){
drawnLayer
.
getFeatures
().
clear
();
intersections
.
clear
();
drawnLayer
.
addFeature
(
feature
);
map
.
getView
().
fitExtent
(
feature
.
getGeometry
()
.
getExtent
(),
map
.
getSize
());
map
.
getView
().
fitExtent
(
geom
.
getExtent
(),
map
.
getSize
());
displayInfo
();
draw
.
setActive
(
false
);
...
...
@@ -460,6 +468,10 @@ const regionChooser = (function(){
publicScope
.
copyCoordinatesToClipboard
=
function
(){
var
geom
=
sketch
.
getGeometry
().
clone
().
transform
(
sourceProj
,
'
EPSG:4326
'
);
if
(
!
utils
.
is_polygon
(
geom
)){
console
.
warn
(
"
Sorry, can only export single polygons.
"
);
return
false
;
}
var
wgs84Coords
=
geom
.
getLinearRing
(
0
).
getCoordinates
();
var
wktPolygon
=
"
POLYGON((
"
;
var
precision
=
6
;
// ~ 10 cm precision
...
...
This diff is collapsed.
Click to expand it.
src/main/resources/eu/simstadt/regionchooser/website/script/utils.js
+
24
-
20
View file @
05caa4b2
var
utils
=
{};
utils
.
groupBy
=
function
(
xs
,
key
)
{
return
xs
.
reduce
(
function
(
rv
,
x
)
{
(
rv
[
x
[
key
]]
=
rv
[
x
[
key
]]
||
[]).
push
(
x
);
return
rv
;
utils
.
groupBy
=
function
(
xs
,
key
)
{
return
xs
.
reduce
(
function
(
rv
,
x
)
{
(
rv
[
x
[
key
]]
=
rv
[
x
[
key
]]
||
[]).
push
(
x
);
return
rv
;
},
{});
}
// Copies a string to the clipboard. Must be called from within an
// event handler such as click. May return false if it failed, but
// this is not always possible. Browser support for Chrome 43+,
...
...
@@ -15,7 +15,7 @@ utils.groupBy = function(xs, key) {
// an administrator. By default a prompt is shown the first
// time the clipboard is used (per session).
// https://stackoverflow.com/a/33928558/6419007
utils
.
copyToClipboard
=
function
(
text
,
log
)
{
utils
.
copyToClipboard
=
function
(
text
,
log
)
{
if
(
window
.
clipboardData
&&
window
.
clipboardData
.
setData
)
{
// Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
return
window
.
clipboardData
.
setData
(
"
Text
"
,
text
);
...
...
@@ -40,25 +40,29 @@ utils.copyToClipboard = function(text, log) {
}
}
}
utils
.
read_kml
=
function
(
url
){
utils
.
read_kml
=
function
(
url
)
{
return
new
ol
.
source
.
KML
({
projection
:
ol
.
proj
.
get
(
'
EPSG:3857
'
),
url
:
url
,
extractAttributes
:
false
,
extractStyles
:
false
projection
:
ol
.
proj
.
get
(
'
EPSG:3857
'
),
url
:
url
,
extractAttributes
:
false
,
extractStyles
:
false
});
}
utils
.
polygon_style
=
function
(
color
,
alpha
)
{
utils
.
is_polygon
=
function
(
geom
)
{
return
(
'
getType
'
in
geom
)
&&
(
geom
.
getType
()
===
'
Polygon
'
);
}
utils
.
polygon_style
=
function
(
color
,
alpha
)
{
return
new
ol
.
style
.
Style
({
fill
:
new
ol
.
style
.
Fill
({
color
:
'
rgba(255, 255, 255,
'
+
alpha
+
'
)
'
fill
:
new
ol
.
style
.
Fill
({
color
:
'
rgba(255, 255, 255,
'
+
alpha
+
'
)
'
}),
stroke
:
new
ol
.
style
.
Stroke
({
color
:
color
,
width
:
2
,
lineDash
:
[
5
,
10
]
stroke
:
new
ol
.
style
.
Stroke
({
color
:
color
,
width
:
2
,
lineDash
:
[
5
,
10
]
}),
});
}
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment