Hello, I am trying to use the attribute rules in my polygon feature to find the nearest school to each polygon. I have the following below, but it seems to be returning a school further away. Can someone please help?
Thanks in advance.
var CURRENTSCHOOLS = FeatureSetByName($datastore, "ELEMENTARY_SCHOOL", ["School_Nam"]);
VAR SEARCHDISTANCE = 10;
VAR SCHOOLINTERSECT = INTERSECTS(CURRENTSCHOOLS, BUFFER($FEATURE, SEARCHDISTANCE, "MILES"))
VAR MINDISTANCE = INFINITY
VAR FSCHOOL = FIRST(SCHOOLINTERSECT)
IF (FSCHOOL == NULL) RETURN ""
IF(SEARCHDISTANCE < MINDISTANCE)
RETURN FSCHOOL.SCHOOL_NAM
Solved! Go to Solution.
var CURRENTSCHOOLS = FeatureSetByName($datastore, "ELEMENTARY_SCHOOL", ["School_Nam"]);
VAR SEARCHDISTANCE = 10;
VAR SCHOOLINTERSECT = INTERSECTS(CURRENTSCHOOLS, BUFFER($FEATURE, SEARCHDISTANCE, "MILES"))
IF(SCHOOLINTERSECT == null || COUNT(SCHOOLINTERSECT) == 0) {
RETURN ""
}
VAR MINDISTANCE = INFINITY
VAR NEARESTSCHOOL = ""
FOR(VAR SCHOOL IN SCHOOLINTERSECT) {
VAR DIST = DISTANCE(SCHOOL, $FEATURE)
IF(DIST < MINDISTANCE) {
MINDIST = DIST
NEARESTSCHOOL = SCHOOL.SCHOOL_NAM
}
}
RETURN NEARESTSCHOOL
var CURRENTSCHOOLS = FeatureSetByName($datastore, "ELEMENTARY_SCHOOL", ["School_Nam"]);
VAR SEARCHDISTANCE = 10;
VAR SCHOOLINTERSECT = INTERSECTS(CURRENTSCHOOLS, BUFFER($FEATURE, SEARCHDISTANCE, "MILES"))
IF(SCHOOLINTERSECT == null || COUNT(SCHOOLINTERSECT) == 0) {
RETURN ""
}
VAR MINDISTANCE = INFINITY
VAR NEARESTSCHOOL = ""
FOR(VAR SCHOOL IN SCHOOLINTERSECT) {
VAR DIST = DISTANCE(SCHOOL, $FEATURE)
IF(DIST < MINDISTANCE) {
MINDIST = DIST
NEARESTSCHOOL = SCHOOL.SCHOOL_NAM
}
}
RETURN NEARESTSCHOOL
Thanks so much Johannes! I had an error but made the change from MINDIST TO MINDISTANCE line 12 and i worked..
I hate to ask, but would there be a way to add a rule that returns the distance from the polygon to the nearest school? Thanks again
Sure. Same as this rule, but return MINDISTANCE instead of NEARESTSCHOOL.
Thanks again!
Would it be possible to find the nearest schools within a certain school district only. The School District that would be referenced would be a entered field within the feature, Thanks
// change: load your school district field
var CURRENTSCHOOLS = FeatureSetByName($datastore, "ELEMENTARY_SCHOOL", ["School_Nam", "School_District"]);
// change: filter schools by district
var district = $feature.School_District
if(district != null) {
CURRENTSCHOOLS = Filter(CURRENTSCHOOLS, "School_District = @district")
}
// rest stays the same
VAR SEARCHDISTANCE = 10;
VAR SCHOOLINTERSECT = INTERSECTS(CURRENTSCHOOLS, BUFFER($FEATURE, SEARCHDISTANCE, "MILES"))
IF(SCHOOLINTERSECT == null || COUNT(SCHOOLINTERSECT) == 0) {
RETURN ""
}
VAR MINDISTANCE = INFINITY
VAR NEARESTSCHOOL = ""
FOR(VAR SCHOOL IN SCHOOLINTERSECT) {
VAR DIST = DISTANCE(SCHOOL, $FEATURE)
IF(DIST < MINDISTANCE) {
MINDISTANCE = DIST
NEARESTSCHOOL = SCHOOL.SCHOOL_NAM
}
}
RETURN NEARESTSCHOOL
Thank you for your response, i have been working on getting what you suggested to work, but still no luck. I Probably didnt provide enough info:
//Note: ELEMENTARY_SCHOOL is the feature that has all the schools
// Note: DISTRICT_1 is the field located in ELEMENTARY_SCHOOL that lists the School District the school is located in,
//Note: var district = $feature.School_District - Is the field that contains the School District to search within and is the feature class named PROPERTIES (The layer with the Attribute Rule)
The below returns a null value everytime, not sure what I am doing wrong. Thanks
// change: load your school district field
var CURRENTSCHOOLS = FeatureSetByName($datastore, "ELEMENTARY_SCHOOL", ["School_Nam", "DISTRICT_1"]);
// change: filter schools by district
var district = $feature.School_District
if(district != null) {
CURRENTSCHOOLS = Filter(CURRENTSCHOOLS, "DISTRICT_1 = @district")
}
// rest stays the same
VAR SEARCHDISTANCE = 30;
VAR SCHOOLINTERSECT = INTERSECTS(CURRENTSCHOOLS, BUFFER($FEATURE, SEARCHDISTANCE, "MILES"))
IF(SCHOOLINTERSECT == null || COUNT(SCHOOLINTERSECT) == 0) {
RETURN ""
}
VAR MINDISTANCE = INFINITY
VAR NEARESTSCHOOL = ""
FOR(VAR SCHOOL IN SCHOOLINTERSECT) {
VAR DIST = DISTANCE(SCHOOL, $FEATURE)
IF(DIST < MINDISTANCE) {
MINDISTANCE = DIST
NEARESTSCHOOL = SCHOOL.SCHOOL_NAM
}
}
RETURN NEARESTSCHOOL
If the rule returns an empty string, it means it didn't find a school in teh specified search radius. If it worked before adding the filter, then the problem is probably in the filter.
var log = ""
var CURRENTSCHOOLS = FeatureSetByName($datastore, "ELEMENTARY_SCHOOL", ["School_Nam", "DISTRICT_1"]);
log += Count(CURRENTSCHOOLS) + " schools loaded; "
var district = $feature.School_District
if(!IsEmpty(district)) {
log += "filtering schools by '" + district + "'; "
CURRENTSCHOOLS = Filter(CURRENTSCHOOLS, "DISTRICT_1 = @district")
log += Count(CURRENTSCHOOLS) + " schools found; "
} else {
log += "School_District is empty; "
}
VAR SEARCHDISTANCE = 30;
VAR SCHOOLINTERSECT = INTERSECTS(CURRENTSCHOOLS, BUFFER($FEATURE, SEARCHDISTANCE, "MILES"))
log += Count(SCHOOLINTERSECT) + " schools found in the search radius; "
IF(SCHOOLINTERSECT == null || COUNT(SCHOOLINTERSECT) == 0) {
return log
}
VAR MINDISTANCE = INFINITY
VAR NEARESTSCHOOL = ""
FOR(VAR SCHOOL IN SCHOOLINTERSECT) {
VAR DIST = DISTANCE(SCHOOL, $FEATURE)
IF(DIST < MINDISTANCE) {
MINDISTANCE = DIST
NEARESTSCHOOL = SCHOOL.SCHOOL_NAM
}
}
RETURN NEARESTSCHOOL