Geocode neighborhood names to an approximate location (no source coords)
Many Medjobs/Telegram ads name a Tehran neighborhood («ونک», «تهرانپارس»…) but carry no coordinates. New TehranGeo geocoder maps ~45 neighborhood names to a rough center; Publish falls back to it (from the resolved district / AI district / area note) when the source ad has no point. Shown via the existing «محدودهٔ تقریبی» circle + disclaimer — never a precise pin. Tehran-only; extends the existing approx-coords feature so non-Divar listings can show a map too. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -307,6 +307,14 @@ public class IngestionService
|
||||
?? cities.FirstOrDefault(c => c.IsActive) ?? cities.First();
|
||||
var district = districts.FirstOrDefault(x => x.Name == districtName && x.CityId == city.Id);
|
||||
|
||||
// Approx. coords for the map: the source ad's point (Divar) when present; otherwise, for a
|
||||
// Tehran ad that only NAMES a neighborhood (Medjobs/Telegram), geocode that name to a rough
|
||||
// center. Shown as a «محدودهٔ تقریبی» circle, never a precise pin.
|
||||
double? appLat = raw.Lat, appLng = raw.Lng;
|
||||
if (appLat is null && city.Name == "تهران"
|
||||
&& TehranGeo.Locate(district?.Name, districtName, parsed.AreaNote) is { } g)
|
||||
{ appLat = g.lat; appLng = g.lng; }
|
||||
|
||||
var kindStr = (d?.Kind ?? parsed.Kind.ToString()).ToLowerInvariant();
|
||||
|
||||
// «آماده به کار» — a worker offering themselves. No facility involved.
|
||||
@@ -334,7 +342,7 @@ public class IngestionService
|
||||
Phone = !string.IsNullOrWhiteSpace(d?.Phone) ? d!.Phone!.Trim() : parsed.Phone,
|
||||
Description = raw.RawText,
|
||||
Status = ShiftStatus.Open, Source = ShiftSource.Aggregated, SourceUrl = raw.SourceUrl,
|
||||
Lat = raw.Lat, Lng = raw.Lng, // approx. area from the source ad (Divar)
|
||||
Lat = appLat, Lng = appLng, // source point (Divar) or geocoded neighborhood center
|
||||
Contacts = BuildContacts(d, parsed),
|
||||
Tags = BuildTags(parsed, d, role, city, extraRoleTags),
|
||||
});
|
||||
@@ -382,7 +390,7 @@ public class IngestionService
|
||||
SalaryMin = parsed.PayAmount,
|
||||
Description = raw.RawText, Status = ShiftStatus.Open, Source = ShiftSource.Aggregated,
|
||||
SourceUrl = raw.SourceUrl,
|
||||
Lat = raw.Lat, Lng = raw.Lng, // approx. area from the source ad (Divar)
|
||||
Lat = appLat, Lng = appLng, // source point (Divar) or geocoded neighborhood center
|
||||
Contacts = BuildContacts(d, parsed), // the ad's OWN number(s) — fresh per listing
|
||||
});
|
||||
}
|
||||
@@ -401,7 +409,7 @@ public class IngestionService
|
||||
: parsed.PayAmount is null ? PayType.Negotiable : PayType.PerShift,
|
||||
PayAmount = parsed.PayAmount, SharePercent = parsed.SharePercent,
|
||||
Status = ShiftStatus.Open, Source = ShiftSource.Aggregated, SourceUrl = raw.SourceUrl,
|
||||
Lat = raw.Lat, Lng = raw.Lng, // approx. area from the source ad (Divar)
|
||||
Lat = appLat, Lng = appLng, // source point (Divar) or geocoded neighborhood center
|
||||
Contacts = BuildContacts(d, parsed), // the ad's OWN number(s) — fresh per listing
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user